// Trata a criação de novos níveis e respectivas relações. Caso se trate // de um nível orgânico (estrutural e que esteja associado a uma EP) o // nível correspondente deverá já existir e não será por isso criado, // será criada apenas a relação. private bool handleNewNivel(Form frm, GISADataset.NivelRow parentNivelRow, GISADataset.TipoNivelRelacionadoRow tnrRow) { frm.Text = "Criar " + tnrRow.Designacao; // se se tratar de uma série ou subsérie if (tnrRow.ID == TipoNivelRelacionado.SR || tnrRow.ID == TipoNivelRelacionado.SSR) { FormNivelDocumental frmDoc = (FormNivelDocumental)frm; frmDoc.grpCodigo.Text += " previsto"; frmDoc.txtCodigo.Enabled = false; GisaDataSetHelper.HoldOpen ho = new GisaDataSetHelper.HoldOpen(GisaDataSetHelper.GetConnection()); try { NivelRule.Current.FillTipoNivelRelacionadoCodigo(GisaDataSetHelper.GetInstance(), ho.Connection); } catch (Exception ex) { Trace.WriteLine(ex); throw; } finally { ho.Dispose(); } frmDoc.txtCodigo.Text = NiveisHelper.getNextSeriesCodigo(false); } bool successfulSave = true; switch (frm.ShowDialog()) { case DialogResult.OK: { Trace.WriteLine("A criar nível..."); long click = DateTime.Now.Ticks; GISADataset.NivelRow nRow = null; GISADataset.NivelDesignadoRow ndRow = null; GISADataset.NivelControloAutRow ncaRow = null; GISADataset.FRDBaseRow frdRow = null; string designacaoUFAssociada = string.Empty; bool addNewUF = false; PostSaveAction postSaveAction = null; // Create a new Nivel with or without a Notícia autoridade if (frm is FormNivelEstrutural && ((FormNivelEstrutural)frm).chkControloAut) { GISADataset.ControloAutRow caRow = null; caRow = ((GISADataset.ControloAutDicionarioRow)(((FormNivelEstrutural)frm). caList.SelectedItems[0].Tag)).ControloAutRow; GisaDataSetHelper.HoldOpen ho = new GisaDataSetHelper.HoldOpen(GisaDataSetHelper.GetConnection()); try { DBAbstractDataLayer.DataAccessRules.NivelRule.Current.LoadNivelByControloAut(caRow.ID, GisaDataSetHelper.GetInstance(), ho.Connection); } finally { ho.Dispose(); } ncaRow = caRow.GetNivelControloAutRows()[0]; nRow = ncaRow.NivelRow; // Impedir criação de relações repetidas entre niveis // estruturais e níveis "logicos" if (GisaDataSetHelper.GetInstance().RelacaoHierarquica.Select(string.Format("ID={0} AND IDUpper={1} OR ID={1} AND IDUpper={0}", parentNivelRow.ID, nRow.ID)).Length > 0) { MessageBox.Show("A relação pretendida já existe e não pode ser duplicada.", "Adição de relação", MessageBoxButtons.OK, MessageBoxIcon.Warning); return false; } } else { nRow = GisaDataSetHelper.GetInstance().Nivel. AddNivelRow(tnrRow.TipoNivelRow, ((FormAddNivel)frm).txtCodigo.Text.Trim(), "NVL", new byte[]{}, 0); ndRow = GisaDataSetHelper.GetInstance().NivelDesignado. AddNivelDesignadoRow(nRow, ((FormAddNivel)frm).txtDesignacao.Text.Trim(), new byte[]{}, 0); if (nRow.IDTipoNivel != TipoNivel.LOGICO) frdRow = GisaDataSetHelper.GetInstance().FRDBase.AddFRDBaseRow(nRow, (GISADataset.TipoFRDBaseRow)(GisaDataSetHelper.GetInstance().TipoFRDBase. Select("ID=" + DomainValuesHelper.stringifyEnumValue(TipoFRDBase.FRDOIRecolha))[0]), "", "", new byte[]{}, 0); if (nRow.IDTipoNivel == TipoNivel.DOCUMENTAL && ((FormNivelDocumental)frm).CreateUFAssociada) { designacaoUFAssociada = ((FormNivelDocumental)frm).DesignacaoUF; addNewUF = true; } } // valores por omissão var globalConfig = GisaDataSetHelper.GetInstance().GlobalConfig.Cast<GISADataset.GlobalConfigRow>().Single(); if (globalConfig.ApplyDefaultValues && nRow.IDTipoNivel == TipoNivel.DOCUMENTAL) { var sfrdcaRow = GisaDataSetHelper.GetInstance().SFRDCondicaoDeAcesso .AddSFRDCondicaoDeAcessoRow(frdRow, "", globalConfig.IsCondicaoDeAcessoNull() ? "" : globalConfig.CondicaoDeAcesso, globalConfig.IsCondicaoDeReproducaoNull() ? "" : globalConfig.CondicaoDeReproducao, "", new byte[] { }, 0); foreach (GISADataset.ConfigLinguaRow r in globalConfig.GetConfigLinguaRows()) GisaDataSetHelper.GetInstance().SFRDLingua.AddSFRDLinguaRow(sfrdcaRow, r.Iso639Row, new byte[] { }, 0); foreach (GISADataset.ConfigAlfabetoRow r in globalConfig.GetConfigAlfabetoRows()) GisaDataSetHelper.GetInstance().SFRDAlfabeto.AddSFRDAlfabetoRow(sfrdcaRow, r.Iso15924Row, new byte[] { }, 0); } GISADataset.RelacaoHierarquicaRow rhRow = null; // garantir que os nós raiz não são criados com pais if (tnrRow.ID != TipoNivelRelacionado.ED) rhRow = GisaDataSetHelper.GetInstance().RelacaoHierarquica. AddRelacaoHierarquicaRow(nRow, parentNivelRow, tnrRow, null, null, null, null, null, null, null, new byte[]{}, 0); // Só adicionar permissões ao grupo TODOS dos níveis lógicos e a níveis documentais imediatamente // abaixo de níveis orgânicos (Documentos soltos e séries); caso se se trate de um nível estrutural // controlado, as permissões já foram atribuidas aquando da criação do controlo de autoridade if (nRow.IDTipoNivel == TipoNivel.LOGICO || (nRow.IDTipoNivel == TipoNivel.DOCUMENTAL && parentNivelRow.IDTipoNivel == TipoNivel.ESTRUTURAL)) { var nUpperRow = rhRow == null ? default(GISADataset.NivelRow) : rhRow.NivelRowByNivelRelacaoHierarquicaUpper; PermissoesHelper.AddNewNivelGrantPermissions(nRow, nUpperRow); } // actualizar permissões implícitas postSaveAction = new PostSaveAction(); PersistencyHelper.UpdatePermissionsPostSaveArguments args = new PersistencyHelper.UpdatePermissionsPostSaveArguments(); postSaveAction.args = args; postSaveAction.postSaveDelegate = delegate(PersistencyHelper.PostSaveArguments postSaveArgs) { if (!postSaveArgs.cancelAction && nRow != null && nRow.RowState != DataRowState.Detached && nRow.RowState != DataRowState.Deleted) { if (addNewUF) { // registar a criação da unidade física GISADataset.FRDBaseRow frdUFRow = nRow.GetFRDBaseRows()[0].GetSFRDUnidadeFisicaRows()[0].NivelRow.GetFRDBaseRows()[0]; CurrentContext.RaiseRegisterModificationEvent(frdUFRow); } // registar a criação do nivel documental GISADataset.FRDBaseRow frdDocRow = null; GISADataset.FRDBaseRow[] frdDocRows = nRow.GetFRDBaseRows(); if (frdDocRows.Length > 0) frdDocRow = frdDocRows[0]; CurrentContext.RaiseRegisterModificationEvent(frdDocRow); PersistencyHelperRule.Current.saveRows(GisaDataSetHelper.GetInstance().FRDBaseDataDeDescricao, GisaDataSetHelper.GetInstance().FRDBaseDataDeDescricao.Cast<GISADataset.FRDBaseDataDeDescricaoRow>().Where(frd => frd.RowState == DataRowState.Added).ToArray(), postSaveArgs.tran); } }; // se se tratar de uma série ou subsérie if (tnrRow.ID == TipoNivelRelacionado.SR || tnrRow.ID == TipoNivelRelacionado.SSR) { // é necessário garantir que o código gerado ainda não está // em uso, por isso geramo-lo dentro da própria transacção PersistencyHelper.ValidateNivelAddAndAssocNewUFPreConcArguments pcArgs = new PersistencyHelper.ValidateNivelAddAndAssocNewUFPreConcArguments(); PersistencyHelper.SetNewCodigosPreSaveArguments psArgs = new PersistencyHelper.SetNewCodigosPreSaveArguments(); PersistencyHelper.VerifyIfRHNivelUpperExistsPreConcArguments pcArgsNivel = new PersistencyHelper.VerifyIfRHNivelUpperExistsPreConcArguments(); PersistencyHelper.FetchLastCodigoSeriePreSaveArguments psArgsNivel = new PersistencyHelper.FetchLastCodigoSeriePreSaveArguments(); PersistencyHelper.AddEditUFPreConcArguments pcArgsUF = new PersistencyHelper.AddEditUFPreConcArguments(); PersistencyHelper.IsCodigoUFBeingUsedPreSaveArguments psArgsUF = new PersistencyHelper.IsCodigoUFBeingUsedPreSaveArguments(); pcArgs.argsNivel = pcArgsNivel; pcArgs.argsUF = pcArgsUF; psArgs.argsNivel = psArgsNivel; psArgs.argsUF = psArgsUF; // dados que serão usados no delegate responsável pela criação do nível documental pcArgsNivel.nRowID = nRow.ID; pcArgsNivel.ndRowID = ndRow.ID; pcArgsNivel.rhRowID = rhRow.ID; pcArgsNivel.rhRowIDUpper = rhRow.IDUpper; pcArgsNivel.frdBaseID = frdRow.ID; // dados para a atribuição de um código ao nível documental psArgsNivel.nRowID = nRow.ID; psArgsNivel.pcArgs = pcArgsNivel; if (addNewUF) { // dados que serão usados no delegate responsável pela criação da unidade física pcArgsUF.Operation = PersistencyHelper.AddEditUFPreConcArguments.Operations.Create; pcArgsUF.psa = psArgsUF; // dados que serão usados no delegate que fará a associação entre o nível documental e unidade física pcArgs.addNewUF = true; pcArgs.IDFRDBaseNivelDoc = frdRow.ID; pcArgs.produtor = this.nivelNavigator1.SelectedNode; pcArgs.designacaoUFAssociada = designacaoUFAssociada; } // permitir ao delegate selecionar o delegate correspondente ao tipo de nível que se está a criar pcArgs.IDTipoNivelRelacionado = tnrRow.ID; psArgs.createNewNivelCodigo = true; psArgs.createNewUFCodigo = addNewUF; PersistencyHelper.save(DelegatesHelper.ValidateNivelAddAndAssocNewUF, pcArgs, DelegatesHelper.SetNewCodigos, psArgs, postSaveAction); if (! pcArgsNivel.RHNivelUpperExists) { successfulSave = false; MessageBox.Show(pcArgsNivel.message, "Criação de unidade de descrição", MessageBoxButtons.OK, MessageBoxIcon.Warning); } else if (addNewUF && pcArgsUF.OperationError == PersistencyHelper.AddEditUFPreConcArguments.OperationErrors.NewUF) MessageBox.Show(pcArgsUF.message, "Criar unidade física", MessageBoxButtons.OK, MessageBoxIcon.Warning); } else if (tnrRow.ID == TipoNivelRelacionado.D || tnrRow.ID == TipoNivelRelacionado.SD) { // se se tratar de um (sub)documento é necessário garantir que se trata de um código // único dentro da sua série (se constituir série) ou nivel estrutural superior PersistencyHelper.ValidateNivelAddAndAssocNewUFPreConcArguments pcArgs = new PersistencyHelper.ValidateNivelAddAndAssocNewUFPreConcArguments(); PersistencyHelper.SetNewCodigosPreSaveArguments psArgs = new PersistencyHelper.SetNewCodigosPreSaveArguments(); PersistencyHelper.EnsureUniqueCodigoNivelPreConcArguments pcArgsNivel = new PersistencyHelper.EnsureUniqueCodigoNivelPreConcArguments(); PersistencyHelper.AddEditUFPreConcArguments pcArgsUF = new PersistencyHelper.AddEditUFPreConcArguments(); PersistencyHelper.IsCodigoUFBeingUsedPreSaveArguments psArgsUF = new PersistencyHelper.IsCodigoUFBeingUsedPreSaveArguments(); pcArgs.argsNivel = pcArgsNivel; pcArgs.argsUF = pcArgsUF; // dados que serão usados no delegate responsável pela criação do nível documental pcArgsNivel.nRowID = nRow.ID; pcArgsNivel.ndRowID = ndRow.ID; pcArgsNivel.rhRowID = rhRow.ID; pcArgsNivel.rhRowIDUpper = rhRow.IDUpper; pcArgsNivel.frdBaseID = frdRow.ID; pcArgsNivel.testOnlyWithinNivel = true; if (addNewUF) { // dados que serão usados no delegate responsável pela criação da unidade física pcArgsUF.Operation = PersistencyHelper.AddEditUFPreConcArguments.Operations.Create; pcArgsUF.psa = psArgsUF; // dados que serão usados no delegate que fará a associação entre o nível documental e unidade física pcArgs.addNewUF = true; pcArgs.IDFRDBaseNivelDoc = frdRow.ID; pcArgs.produtor = this.nivelNavigator1.SelectedNode; pcArgs.designacaoUFAssociada = designacaoUFAssociada; } // permitir ao delegate selecionar o delegate correspondente ao tipo de nível que se está a criar pcArgs.IDTipoNivelRelacionado = tnrRow.ID; psArgs.createNewNivelCodigo = false; psArgs.createNewUFCodigo = addNewUF; psArgs.setNewCodigo = rhRow.IDTipoNivelRelacionado == TipoNivelRelacionado.SD; psArgs.argsUF = psArgsUF; psArgs.argsNivelDocSimples = NiveisHelper.AddNivelDocumentoSimplesWithDelegateArgs(nRow.GetNivelDesignadoRows().Single(), rhRow.IDUpper, rhRow.IDTipoNivelRelacionado); PersistencyHelper.save(DelegatesHelper.ValidateNivelAddAndAssocNewUF, pcArgs, DelegatesHelper.SetNewCodigos, psArgs, postSaveAction); if (! pcArgsNivel.successful) { successfulSave = false; MessageBox.Show(pcArgsNivel.message, "Criação de unidade de descrição", MessageBoxButtons.OK, MessageBoxIcon.Warning); } else if (parentNivelRow.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica()[0].TipoNivelRelacionadoRow.ID == TipoNivelRelacionado.SR) { GisaDataSetHelper.HoldOpen ho = new GisaDataSetHelper.HoldOpen(GisaDataSetHelper.GetConnection()); try { DBAbstractDataLayer.DataAccessRules.FRDRule.Current.LoadSFRDAvaliacaoData(GisaDataSetHelper.GetInstance(), parentNivelRow.ID, ho.Connection); } finally { ho.Dispose(); } } } else if (nRow.IDTipoNivel == TipoNivel.ESTRUTURAL && ! (nRow.CatCode.Trim().Equals("CA"))) { // se se tratar de um nivel estrutural temático-funcional // é necessário garantir que se trata de um código único no sistema PersistencyHelper.EnsureUniqueCodigoNivelPreConcArguments pcArgs = new PersistencyHelper.EnsureUniqueCodigoNivelPreConcArguments(); pcArgs.nRowID = nRow.ID; pcArgs.ndRowID = ndRow.ID; pcArgs.rhRowID = rhRow.ID; pcArgs.rhRowIDUpper = rhRow.IDUpper; PersistencyHelper.save(DelegatesHelper.ensureUniqueCodigo, pcArgs, postSaveAction); if (! pcArgs.successful) { successfulSave = false; MessageBox.Show(pcArgs.message, "Criação de unidade de descrição", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } else if (nRow.IDTipoNivel == TipoNivel.LOGICO && nRow.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica().Length == 0) { // se se tratar de uma entidade detentora // é necessário garantir que se trata de um código único no sistema PersistencyHelper.EnsureUniqueCodigoNivelPreConcArguments pcArgs = new PersistencyHelper.EnsureUniqueCodigoNivelPreConcArguments(); pcArgs.nRowID = nRow.ID; pcArgs.ndRowID = ndRow.ID; pcArgs.testOnlyWithinNivel = true; PersistencyHelper.save(DelegatesHelper.ensureUniqueCodigo, pcArgs, postSaveAction); if (!pcArgs.successful) { successfulSave = false; MessageBox.Show(pcArgs.message, "Criação de unidade de descrição", MessageBoxButtons.OK, MessageBoxIcon.Warning); // forçar o refresh das entidades produtoras (qualquer outro que esteja expandido // vai ser colapsado) resetEstrutura(); } } else if (nRow.IDTipoNivel == TipoNivel.ESTRUTURAL && nRow.CatCode.Trim().Equals("CA")) { GISADataset.TipoFRDBaseRow tipoFRD = (GISADataset.TipoFRDBaseRow)(GisaDataSetHelper.GetInstance().TipoFRDBase.Select("ID=" + DomainValuesHelper.stringifyEnumValue(TipoFRDBase.FRDOIRecolha))[0]); if (GisaDataSetHelper.GetInstance().FRDBase.Select(string.Format("IDNivel={0} AND IDTipoFRDBase={1}", nRow.ID.ToString(), tipoFRD.ID.ToString())).Length == 0) { GISADataset.FRDBaseRow frdNivelDocRow = GisaDataSetHelper.GetInstance().FRDBase.AddFRDBaseRow(nRow, tipoFRD, "", "", new byte[] { }, 0); GisaDataSetHelper.GetInstance().SFRDDatasProducao.AddSFRDDatasProducaoRow(frdNivelDocRow, "", "", "", "", false, "", "", "", "", false, new byte[] { }, 0); GisaDataSetHelper.GetInstance().SFRDConteudoEEstrutura.AddSFRDConteudoEEstruturaRow(frdNivelDocRow, "", "", new byte[] { }, 0); GisaDataSetHelper.GetInstance().SFRDContexto.AddSFRDContextoRow(frdNivelDocRow, "", "", "", false, new byte[] { }, 0); GisaDataSetHelper.GetInstance().SFRDDocumentacaoAssociada.AddSFRDDocumentacaoAssociadaRow(frdNivelDocRow, "", "", "", "", new byte[] { }, 0); GisaDataSetHelper.GetInstance().SFRDDimensaoSuporte.AddSFRDDimensaoSuporteRow(frdNivelDocRow, "", new byte[] { }, 0); GisaDataSetHelper.GetInstance().SFRDNotaGeral.AddSFRDNotaGeralRow(frdNivelDocRow, "", new byte[] { }, 0); var CurrentSFRDAvaliacao = GisaDataSetHelper.GetInstance().SFRDAvaliacao.NewSFRDAvaliacaoRow(); CurrentSFRDAvaliacao.FRDBaseRow = frdNivelDocRow; CurrentSFRDAvaliacao.IDPertinencia = 1; CurrentSFRDAvaliacao.IDDensidade = 1; CurrentSFRDAvaliacao.IDSubdensidade = 1; CurrentSFRDAvaliacao.Publicar = false; CurrentSFRDAvaliacao.Observacoes = ""; CurrentSFRDAvaliacao.AvaliacaoTabela = false; GisaDataSetHelper.GetInstance().SFRDAvaliacao.AddSFRDAvaliacaoRow(CurrentSFRDAvaliacao); var sfrdcda = GisaDataSetHelper.GetInstance().SFRDCondicaoDeAcesso.AddSFRDCondicaoDeAcessoRow(frdNivelDocRow, "", "", "", "", new byte[] { }, 0); var caRow = nRow.GetNivelControloAutRows().Single().ControloAutRow; if (!caRow.IsIDIso639p2Null()) GisaDataSetHelper.GetInstance().SFRDLingua.AddSFRDLinguaRow(sfrdcda, caRow.Iso639Row, new byte[] { }, 0); else if (globalConfig.ApplyDefaultValues) { foreach (GISADataset.ConfigLinguaRow r in globalConfig.GetConfigLinguaRows()) GisaDataSetHelper.GetInstance().SFRDLingua.AddSFRDLinguaRow(sfrdcda, r.Iso639Row, new byte[] { }, 0); } if (!caRow.IsIDIso15924Null()) GisaDataSetHelper.GetInstance().SFRDAlfabeto.AddSFRDAlfabetoRow(sfrdcda, caRow.Iso15924Row, new byte[] { }, 0); else if (globalConfig.ApplyDefaultValues) { foreach (GISADataset.ConfigAlfabetoRow r in globalConfig.GetConfigAlfabetoRows()) GisaDataSetHelper.GetInstance().SFRDAlfabeto.AddSFRDAlfabetoRow(sfrdcda, r.Iso15924Row, new byte[] { }, 0); } } var sucessfulSave = PersistencyHelper.save(postSaveAction); if(sucessfulSave == PersistencyHelper.SaveResult.successful) GISA.Search.Updater.updateProdutor(nRow.GetNivelControloAutRows()[0].IDControloAut); } else PersistencyHelper.save(postSaveAction); PersistencyHelper.cleanDeletedData(new List<TableDepthOrdered.TableCloudType>(new TableDepthOrdered.TableCloudType[] { PersistencyHelper.determinaNuvem("RelacaoHierarquica"), PersistencyHelper.determinaNuvem("FRDBase") })); if (! successfulSave) return successfulSave; // Para as EDs if (rhRow == null) { //update data resetEstrutura(); } else { if (addNewUF) { // registar a criação da unidade física GISADataset.FRDBaseRow frdUFRow = nRow.GetFRDBaseRows()[0].GetSFRDUnidadeFisicaRows()[0].NivelRow.GetFRDBaseRows()[0]; GISA.Search.Updater.updateUnidadeFisica(frdUFRow.IDNivel); } if (nRow.IDTipoNivel == TipoNivel.DOCUMENTAL) { GISA.Search.Updater.updateNivelDocumentalComProdutores(nRow.ID); GISA.Search.Updater.updateNivelDocumental(nRow.ID); } if (this.nivelNavigator1.PanelToggleState == NivelNavigator.ToggleState.Estrutural) this.nivelNavigator1.RefreshTreeViewControlSelectedBranch(); else this.nivelNavigator1.AddNivel(nRow); } Debug.WriteLine("<<A criar nível...>> " + new TimeSpan(DateTime.Now.Ticks - click).ToString()); break; } case DialogResult.Cancel: { successfulSave = false; break; } } return successfulSave; }
internal static bool Save(CorrespondenciaDocs correspondenciaDoc, Dictionary<Entidade, DataRow> rows) { var dg = (DocumentoGisa)correspondenciaDoc.EntidadeInterna; // listas de IDs tanto dos documentos como dos controlos de autoridade criados para serem usados na // actualização dos índices de pesquisa como também na atribuição de permissões (somente no caso // dos documentos) List<long> nIDs = new List<long>(); List<string> produtoresID = new List<string>(); List<string> assuntosID = new List<string>(); List<string> tipologiasID = new List<string>(); // documentos que vão ser-lhes actualizadas as permissões var nRows = new List<GISADataset.NivelRow>(); nRows = GisaDataSetHelper.GetInstance().Nivel.Cast<GISADataset.NivelRow>().Where(r => r.RowState == DataRowState.Added).ToList(); // atribuição de permissões aos documentos novos nRows.ForEach(r => { var rhRow = r.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica().FirstOrDefault(); if (rhRow == null) PermissoesHelper.AddNewNivelGrantPermissions(r); else PermissoesHelper.AddNewNivelGrantPermissions(r, rhRow.NivelRowByNivelRelacaoHierarquicaUpper); }); // manter uma lista de niveis e controlos de autoridade criados para que seja possível actualizar o // índice de pesquisa var documentoRows = GisaDataSetHelper.GetInstance().Nivel.Cast<GISADataset.NivelRow>().Where(r => r.RowState == DataRowState.Added && r.IDTipoNivel == (long)TipoNivel.DOCUMENTAL).ToList(); var produtorRows = GisaDataSetHelper.GetInstance().ControloAut.Cast<GISADataset.ControloAutRow>().Where(r => r.IDTipoNoticiaAut == (int)TipoNoticiaAut.EntidadeProdutora && r.RowState == DataRowState.Added).ToList(); var assuntoRows = GisaDataSetHelper.GetInstance().ControloAut.Cast<GISADataset.ControloAutRow>().Where(r => (r.IDTipoNoticiaAut == (int)TipoNoticiaAut.Onomastico || r.IDTipoNoticiaAut == (int)TipoNoticiaAut.Ideografico || r.IDTipoNoticiaAut == (int)TipoNoticiaAut.ToponimicoGeografico) && r.RowState == DataRowState.Added).ToList(); var tipologiaRows = GisaDataSetHelper.GetInstance().ControloAut.Cast<GISADataset.ControloAutRow>().Where(r => r.IDTipoNoticiaAut == (int)TipoNoticiaAut.TipologiaInformacional && r.RowState == DataRowState.Added).ToList(); // guardar nas listas os IDs dos documentos e dos controlos de autoridade que foram atribuidos na // base de dados durante o save e criar registos de adição/modificação dos niveis e dos // controlos de autoridade GISADataset.TrusteeUserRow tuOperator = SessionHelper.GetGisaPrincipal().TrusteeUserOperator; DateTime data = DateTime.Now; GISADataset.TrusteeUserRow tuAuthor = null; var docRow = rows[correspondenciaDoc.EntidadeInterna]; var docToReg = default(GISADataset.NivelRow); if (Concorrencia.WasRecordModified(docRow) || Concorrencia.WasRecordModified(((GISADataset.NivelRow)docRow).GetFRDBaseRows().Single())) docToReg = docRow as GISADataset.NivelRow; if (SessionHelper.GetGisaPrincipal().TrusteeUserAuthor != null && !(SessionHelper.GetGisaPrincipal().TrusteeUserAuthor.RowState == DataRowState.Detached)) tuAuthor = SessionHelper.GetGisaPrincipal().TrusteeUserAuthor; // VALIDAÇÕES //validar documento novo PersistencyHelper.ValidaIntegDocExtPreSaveArguments psArgs = new PersistencyHelper.ValidaIntegDocExtPreSaveArguments(); PersistencyHelper.ValidaIntegDocExtPreConcArguments pcArgs = new PersistencyHelper.ValidaIntegDocExtPreConcArguments(); var pcArgsLst = new List<PersistencyHelper.ValidateNivelAddAndAssocNewUFPreConcArguments>(); var psArgsNivelLst = new List<PersistencyHelper.SetNewCodigosPreSaveArguments>(); foreach (var nRow in documentoRows) { var pcArgsNewNivel = new PersistencyHelper.ValidateNivelAddAndAssocNewUFPreConcArguments(); var psArgsNivel = new PersistencyHelper.SetNewCodigosPreSaveArguments(); var pcArgsNivelUniqueCode = new PersistencyHelper.EnsureUniqueCodigoNivelPreConcArguments(); // dados que serão usados no delegate responsável pela criação do nível documental var rhRow = nRow.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica().Single(); pcArgsNivelUniqueCode.nRowID = nRow.ID; pcArgsNivelUniqueCode.ndRowID = nRow.GetNivelDesignadoRows().Single().ID; pcArgsNivelUniqueCode.rhRowID = nRow.ID; pcArgsNivelUniqueCode.rhRowIDUpper = rhRow.IDUpper; pcArgsNivelUniqueCode.frdBaseID = nRow.GetFRDBaseRows().Single().ID; pcArgsNivelUniqueCode.testOnlyWithinNivel = true; pcArgsNewNivel.IDTipoNivelRelacionado = rhRow.IDTipoNivelRelacionado; pcArgsNewNivel.argsNivel = pcArgsNivelUniqueCode; psArgsNivel.createNewNivelCodigo = false; psArgsNivel.createNewUFCodigo = false; psArgsNivel.setNewCodigo = rhRow.IDTipoNivelRelacionado == TipoNivelRelacionado.SD; psArgsNivel.argsNivelDocSimples = NiveisHelper.AddNivelDocumentoSimplesWithDelegateArgs(nRow.GetNivelDesignadoRows().Single(), rhRow.IDUpper, rhRow.IDTipoNivelRelacionado); pcArgsLst.Add(pcArgsNewNivel); psArgsNivelLst.Add(psArgsNivel); } if (documentoRows.Count == 0 && dg != null) { var rhRowOld = GisaDataSetHelper.GetInstance().RelacaoHierarquica.Cast<GISADataset.RelacaoHierarquicaRow>().SingleOrDefault(r => r.RowState == DataRowState.Deleted); var rhRowNew = GisaDataSetHelper.GetInstance().RelacaoHierarquica.Cast<GISADataset.RelacaoHierarquicaRow>().SingleOrDefault(r => r.RowState == DataRowState.Added); if (rhRowOld != null && rhRowNew != null) { var nRow = GisaDataSetHelper.GetInstance().Nivel.Cast<GISADataset.NivelRow>().Single(r => r.ID == dg.Id); var pcArgsNewNivel = new PersistencyHelper.ValidateNivelAddAndAssocNewUFPreConcArguments(); var psArgsNivel = new PersistencyHelper.SetNewCodigosPreSaveArguments(); var pcArgsNivelUniqueCode = new PersistencyHelper.EnsureUniqueCodigoNivelPreConcArguments(); pcArgsNewNivel.argsNivel = pcArgsNivelUniqueCode; // dados que serão usados no delegate responsável pela criação do nível documental pcArgsNivelUniqueCode.nRowID = nRow.ID; pcArgsNivelUniqueCode.ndRowID = nRow.GetNivelDesignadoRows()[0].ID; pcArgsNivelUniqueCode.rhRowID = nRow.ID; pcArgsNivelUniqueCode.rhRowIDUpper = nRow.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica()[0].IDUpper; pcArgsNivelUniqueCode.frdBaseID = nRow.GetFRDBaseRows()[0].ID; pcArgsNivelUniqueCode.testOnlyWithinNivel = true; pcArgsNewNivel.IDTipoNivelRelacionado = TipoNivelRelacionado.D; psArgsNivel.createNewNivelCodigo = false; psArgsNivel.createNewUFCodigo = false; pcArgsLst.Add(pcArgsNewNivel); psArgsNivelLst.Add(psArgsNivel); } } pcArgs.newDocsList = pcArgsLst; psArgs.newDocArgs = psArgsNivelLst; // validar controlo de autoridade novo List<PersistencyHelper.NewControloAutPreSaveArguments> newControloAutArgs = new List<PersistencyHelper.NewControloAutPreSaveArguments>(); foreach (var caRow in GisaDataSetHelper.GetInstance().ControloAut.Cast<GISADataset.ControloAutRow>().Where(c => c.RowState == DataRowState.Added)) { PersistencyHelper.NewControloAutPreSaveArguments args = new PersistencyHelper.NewControloAutPreSaveArguments(); if (caRow.TipoNoticiaAutRow.ID == Convert.ToInt64(TipoNoticiaAut.EntidadeProdutora)) { var nRow = caRow.GetNivelControloAutRows()[0].NivelRow; args.nID = nRow.ID; args.epCodigo = nRow.Codigo; } args.caID = caRow.ID; args.dID = caRow.GetControloAutDicionarioRows()[0].DicionarioRow.ID; args.dTermo = caRow.GetControloAutDicionarioRows()[0].DicionarioRow.Termo.Replace("'", "''"); args.cadIDControloAut = caRow.GetControloAutDicionarioRows()[0].IDControloAut; args.cadIDDicionario = caRow.GetControloAutDicionarioRows()[0].IDDicionario; args.cadIDTipoControloAutForma = caRow.GetControloAutDicionarioRows()[0].IDTipoControloAutForma; newControloAutArgs.Add(args); } psArgs.newControloAutArgs = newControloAutArgs; // Atribuir permissões aos níveis criados PostSaveAction postSaveAction = new PostSaveAction(); PersistencyHelper.UpdatePermissionsPostSaveArguments argsPostSave = new PersistencyHelper.UpdatePermissionsPostSaveArguments(); postSaveAction.args = argsPostSave; postSaveAction.postSaveDelegate = delegate(PersistencyHelper.PostSaveArguments postSaveArgs) { if (!argsPostSave.cancelAction) { if (docToReg != null) { var regNvl = GISA.Model.RecordRegisterHelper.CreateFRDBaseDataDeDescricaoRow(docToReg.GetFRDBaseRows()[0], tuOperator, tuAuthor, data); GisaDataSetHelper.GetInstance().FRDBaseDataDeDescricao.AddFRDBaseDataDeDescricaoRow(regNvl); PersistencyHelperRule.Current.saveRows(GisaDataSetHelper.GetInstance().FRDBaseDataDeDescricao, new DataRow[] { regNvl }, postSaveArgs.tran); } var regCa = produtorRows.Select(caRow => GISA.Model.RecordRegisterHelper.CreateControlAutDataDeDescricaoRow(caRow, tuOperator, tuAuthor, data)).ToList(); regCa.AddRange(assuntoRows.Select(caRow => GISA.Model.RecordRegisterHelper.CreateControlAutDataDeDescricaoRow(caRow, tuOperator, tuAuthor, data))); regCa.AddRange(tipologiaRows.Select(caRow => GISA.Model.RecordRegisterHelper.CreateControlAutDataDeDescricaoRow(caRow, tuOperator, tuAuthor, data))); regCa.ToList().ForEach(r => GisaDataSetHelper.GetInstance().ControloAutDataDeDescricao.AddControloAutDataDeDescricaoRow(r)); PersistencyHelperRule.Current.saveRows(GisaDataSetHelper.GetInstance().ControloAutDataDeDescricao, regCa.ToArray(), postSaveArgs.tran); } }; PersistencyHelper.SaveResult saveResult = PersistencyHelper.save(ValidaIntegDocExt, pcArgs, ValidaIntegDocExt, psArgs, postSaveAction, true); if (saveResult == PersistencyHelper.SaveResult.unsuccessful) { var errorDetailsLst = pcArgsLst.Select(args => ((PersistencyHelper.EnsureUniqueCodigoNivelPreConcArguments)args.argsNivel).message) .Where(msg => msg != null && msg.Length > 0).ToList(); var errorDetails = new StringBuilder(); errorDetailsLst.ForEach(str => errorDetails.AppendLine(str)); // mostrar mensagem DialogResult dResult = MessageBox.Show( errorDetails + System.Environment.NewLine + "A gravação vai ser abortada.", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error); return false; } else if (saveResult == PersistencyHelper.SaveResult.cancel) { GisaDataSetHelper.GetInstance().RejectChanges(); return false; } else { var err = psArgs.newControloAutArgs.FirstOrDefault(e => !e.successTermo || (e.epCodigo != null && !e.successCodigo)); if (err != null) { var errStr = (err.epCodigo != null && !err.successCodigo) ? string.Format("O código {0} já está a ser utilizado por outra entidade produtora.", err.epCodigo) : string.Format("O termo {0} já está a ser utilizado por outro controlo de autoridade.", err.dTermo); // mostrar mensagem DialogResult dResult = MessageBox.Show( errStr + System.Environment.NewLine + "A gravação vai ser abortada.", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error); return false; } } // actualizar os IDs das entidades internas var entidadesInternas = rows.Keys.ToList().OfType<EntidadeInterna>().ToList(); //var entidadesExternas = rows.Keys.ToList().OfType<EntidadeExterna>().ToList(); entidadesInternas.ForEach(ent => ent.Id = (long)rows[ent]["ID"]); //entidadesExternas.ForEach(ent => ent.IDExterno = (long)rows[ent]["ID"]); // actualizar índices de pesquisa foreach (GISADataset.ControloAutRow caRow in produtorRows) produtoresID.Add(caRow.ID.ToString()); foreach (GISADataset.ControloAutRow caRow in assuntoRows) assuntosID.Add(caRow.ID.ToString()); foreach (GISADataset.ControloAutRow caRow in tipologiaRows) tipologiasID.Add(caRow.ID.ToString()); var niveisDocumentais = nRows.Select(r => r.ID.ToString()).ToList(); GISA.Search.Updater.updateNivelDocumental(niveisDocumentais); GISA.Search.Updater.updateNivelDocumentalComProdutores(niveisDocumentais); GISA.Search.Updater.updateProdutor(produtoresID); GISA.Search.Updater.updateAssunto(assuntosID); GISA.Search.Updater.updateTipologia(tipologiasID); return true; }
public static void ImportFromExcel(string fileLocation) { ImportExcel imp = null; string fileExtension = fileLocation.Split('.').Last(); if (fileExtension.Equals("xls")) imp = new ImportExcel97to2003(fileLocation); else if (fileExtension.Equals("xlsx")) imp = new ImportExcel2007Up(fileLocation); else { MessageBox.Show("O formato '" + fileExtension + "' não é reconhecido.", TAG, MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } try { imp.Import(); var uiList = imp.GetUnidadesInformacionais; var ufList = imp.GetUnidadesFisicas; // validar campos obrigatorios uiList.ToList().ForEach(ui => ValidaCamposObrigatorios(ui)); ufList.ToList().ForEach(uf => ValidaCamposObrigatorios(uf)); // validar se não há identificadores repetidos var rep = ValidaIdentificadores(uiList.Select(ui => ui.identificador)); if (rep != null) ExceptionHelper.ThrowException(ExceptionHelper.TAB_DOCUMENTOS, string.Empty, ImportExcel.UI_IDENTIFICADOR, rep.First(), ExceptionHelper.ERR_VALOR_REPETIDO); rep = ValidaIdentificadores(ufList.Select(uf => uf.identificador)); if (rep != null) ExceptionHelper.ThrowException(ExceptionHelper.TAB_UNIDADES_FISICAS, string.Empty, ImportExcel.UI_IDENTIFICADOR, rep.First(), ExceptionHelper.ERR_VALOR_REPETIDO); // validar se não há códigos de referência repetidos por nível superior ValidaCodigosReferencia(uiList); unidadesInformacionais = uiList.ToDictionary(ui => ui.identificador, ui => ui); unidadesFisicas = ufList.ToDictionary(uf => uf.identificador, uf => uf); var niveisDoc = unidadesInformacionais.Values.Where(ui => ui.idNivelSuperior != null && ui.idNivelSuperior.Length > 0 && ui.idNivelSuperior.StartsWith("gisa:")).Select(ui => ui.idNivelSuperior.Replace("gisa:", "")).Distinct(); var niveisUfAssoc = unidadesInformacionais.Values.SelectMany(ui => ui.unidadesFisicas).Where(uf => uf.StartsWith("gisa_uf:")).Select(uf => uf.Replace("gisa_uf:", "").Split('/')[1]).Distinct(); var entidadesProdutoras = unidadesInformacionais.Values.SelectMany(ui => ui.entidadesProdutoras).Distinct(); var autores = unidadesInformacionais.Values.SelectMany(ui => ui.autores).Distinct(); var modelos = unidadesInformacionais.Values.SelectMany(ui => ui.modelo).Distinct(); var diplomas = unidadesInformacionais.Values.SelectMany(ui => ui.diplomaLegal).Distinct(); var onomasticos = unidadesInformacionais.Values.SelectMany(ui => ui.onomasticos).Distinct(); var ideograficos = unidadesInformacionais.Values.SelectMany(ui => ui.ideograficos).Distinct(); var geograficos = unidadesInformacionais.Values.SelectMany(ui => ui.geograficos).Distinct(); var tipologias = unidadesInformacionais.Values.Where(ui => ui.tipoInformacional != null && ui.tipoInformacional.Length > 0).Select(val => val.tipoInformacional).Distinct(); var cas = new List<string>(); cas.AddRange(entidadesProdutoras); cas.AddRange(autores); cas.AddRange(modelos); cas.AddRange(diplomas); cas.AddRange(onomasticos); cas.AddRange(ideograficos); cas.AddRange(geograficos); cas.AddRange(tipologias); // load data LoadEDsInfo(); LoadNiveisDoc(niveisDoc.ToList()); LoadNiveisUfAssoc(niveisUfAssoc.ToList()); LoadControlosAutoridade(cas.Distinct().ToList()); LoadTrustees(); LoadLocalConsulta(); // importação para o data set GisaDataSetHelper.ManageDatasetConstraints(false); uiRows = new Dictionary<string, GISADataset.NivelRow>(); ufRows = new Dictionary<string, GISADataset.NivelRow>(); registos = new Dictionary<GISADataset.FRDBaseRow, Registo>(); unidadesInformacionais.Keys.ToList().ForEach(key => { if (!uiRows.ContainsKey(key)) UIsToGISADatasetRow(unidadesInformacionais[key]); }); unidadesFisicas.Keys.ToList().ForEach(key => { if (!ufRows.ContainsKey(key)) UFsToGISADatasetRows(unidadesFisicas[key]); }); GisaDataSetHelper.ManageDatasetConstraints(true); var pcArgs = new PersistencyHelper.ValidaImportPreConcArguments(); var psArgs = new PersistencyHelper.ValidaImportPreSaveArguments(); var pcArgsLstUI = new List<PersistencyHelper.ValidateNivelAddAndAssocNewUFPreConcArguments>(); var psArgsNivelLstUI = new List<PersistencyHelper.SetNewCodigosPreSaveArguments>(); foreach (var nRow in uiRows.Values) { var pcArgsNewNivel = new PersistencyHelper.ValidateNivelAddAndAssocNewUFPreConcArguments(); var psArgsNivel = new PersistencyHelper.SetNewCodigosPreSaveArguments(); var pcArgsNivelUniqueCode = new PersistencyHelper.EnsureUniqueCodigoNivelPreConcArguments(); // dados que serão usados no delegate responsável pela criação do nível documental var rhRow = nRow.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica().Single(); pcArgsNivelUniqueCode.nRowID = nRow.ID; pcArgsNivelUniqueCode.ndRowID = nRow.GetNivelDesignadoRows().Single().ID; pcArgsNivelUniqueCode.rhRowID = nRow.ID; pcArgsNivelUniqueCode.rhRowIDUpper = rhRow.IDUpper; pcArgsNivelUniqueCode.frdBaseID = nRow.GetFRDBaseRows().Single().ID; pcArgsNivelUniqueCode.testOnlyWithinNivel = true; pcArgsNewNivel.IDTipoNivelRelacionado = rhRow.IDTipoNivelRelacionado; pcArgsNewNivel.argsNivel = pcArgsNivelUniqueCode; psArgsNivel.createNewNivelCodigo = false; psArgsNivel.createNewUFCodigo = false; psArgsNivel.setNewCodigo = rhRow.IDTipoNivelRelacionado == TipoNivelRelacionado.SD; psArgsNivel.argsNivelDocSimples = NiveisHelper.AddNivelDocumentoSimplesWithDelegateArgs(nRow.GetNivelDesignadoRows().Single(), rhRow.IDUpper, rhRow.IDTipoNivelRelacionado); pcArgsLstUI.Add(pcArgsNewNivel); psArgsNivelLstUI.Add(psArgsNivel); } pcArgs.newDocsList = pcArgsLstUI; psArgs.newDocArgs = psArgsNivelLstUI; var pcArgsLstUF = new List<PersistencyHelper.AddEditUFPreConcArguments>(); var psArgsLstUF = new List<PersistencyHelper.IsCodigoUFBeingUsedPreSaveArguments>(); foreach (var nRow in ufRows.Values) { var argsPC = new PersistencyHelper.AddEditUFPreConcArguments(); var argsPS = new PersistencyHelper.IsCodigoUFBeingUsedPreSaveArguments(); argsPC.Operation = PersistencyHelper.AddEditUFPreConcArguments.Operations.Create; argsPC.nivelUFRowID = nRow.ID; argsPC.ndufRowID = nRow.GetNivelDesignadoRows().First().ID; argsPC.rhufRowID = nRow.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica().First().ID; argsPC.rhufRowIDUpper = nRow.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica().First().IDUpper; argsPC.nufufRowID = nRow.GetNivelDesignadoRows().First().GetNivelUnidadeFisicaRows().First().ID; argsPC.frdufRowID = nRow.GetFRDBaseRows().First().ID; argsPS.nivelUFRowID = nRow.ID; argsPC.psa = argsPS; pcArgsLstUF.Add(argsPC); psArgsLstUF.Add(argsPS); } pcArgs.newUfsList = pcArgsLstUF; psArgs.newUfArgs = psArgsLstUF; // actualizar permissões implícitas var postSaveAction = new PostSaveAction(); PersistencyHelper.UpdatePermissionsPostSaveArguments args = new PersistencyHelper.UpdatePermissionsPostSaveArguments(); postSaveAction.args = args; postSaveAction.postSaveDelegate = delegate(PersistencyHelper.PostSaveArguments postSaveArgs) { var regs = registos.Keys .Select(key => RecordRegisterHelper.CreateFRDBaseDataDeDescricaoRow(registos[key].CurrentFRDBase, registos[key].tuOperator, registos[key].tuAuthor, registos[key].data, true)) .ToArray(); regs.ToList().ForEach(reg => GisaDataSetHelper.GetInstance().FRDBaseDataDeDescricao.AddFRDBaseDataDeDescricaoRow(reg)); PersistencyHelperRule.Current.saveRows(GisaDataSetHelper.GetInstance().FRDBaseDataDeDescricao, regs, postSaveArgs.tran); }; var saveResult = PersistencyHelper.save(ValidateImport, pcArgs, ValidateImport, psArgs, postSaveAction, true); if (saveResult == PersistencyHelper.SaveResult.cancel || saveResult == PersistencyHelper.SaveResult.unsuccessful) { string errorMessage = ""; string abortMessage = "A importação vai ser abortada."; if (pcArgs.errorMessage.Length > 0) errorMessage = pcArgs.errorMessage + System.Environment.NewLine + System.Environment.NewLine + abortMessage; else if (psArgs.errorMessage.Length > 0) errorMessage = psArgs.errorMessage + System.Environment.NewLine + System.Environment.NewLine + abortMessage; else errorMessage = "Ocorreu um problema inesperado." + System.Environment.NewLine + abortMessage; MessageBox.Show(errorMessage, TAG, MessageBoxButtons.OK, MessageBoxIcon.Error); GisaDataSetHelper.GetInstance().RejectChanges(); return; } var nUiIds = uiRows.Values.Select(r => r.ID.ToString()).ToList(); var nUfIds = ufRows.Values.Select(r => r.ID.ToString()).ToList(); GISA.Search.Updater.updateNivelDocumental(nUiIds); GISA.Search.Updater.updateNivelDocumentalComProdutores(nUiIds); GISA.Search.Updater.updateUnidadeFisica(nUfIds); PersistencyHelper.cleanDeletedData(); MessageBox.Show("Importação concluída com sucesso.", TAG, MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Exception ex) { Trace.WriteLine(ex); MessageBox.Show("Ocorreu um erro durante a importação." + System.Environment.NewLine + "A operação foi cancelada.", TAG, MessageBoxButtons.OK, MessageBoxIcon.Error); GisaDataSetHelper.GetInstance().RejectChanges(); } }