private void PasteNivel() { var sources = mClipboardNivelItems; var sourceRows = sources.Select(r => r.NivelRowByNivelRelacaoHierarquica).ToList(); var sourceIDs = sourceRows.Select(r => r.ID).ToList(); var targetRow = this.nivelNavigator1.PanelToggleState == NivelNavigator.ToggleState.Estrutural ? ((GISATreeNode)this.nivelNavigator1.SelectedNode).NivelRow : GisaDataSetHelper.GetInstance().Nivel.Cast<GISADataset.NivelRow>().Single(r => r.ID == this.nivelNavigator1.ContextBreadCrumbsPathID); var ho = new GisaDataSetHelper.HoldOpen(GisaDataSetHelper.GetConnection()); try { // carregar todas as relações hierárquicas dos niveis cortados DBAbstractDataLayer.DataAccessRules.NivelRule.Current.LoadNivelRelacoesHierarquicas(GisaDataSetHelper.GetInstance(), sourceIDs, ho.Connection); // carregar toda a informação sobre permissões dos niveis cortados e do seu parent DBAbstractDataLayer.DataAccessRules.PermissoesRule.Current.LoadDataCIPermissoes(GisaDataSetHelper.GetInstance(), sourceIDs, ho.Connection); DBAbstractDataLayer.DataAccessRules.PermissoesRule.Current.LoadDataCIPermissoes(GisaDataSetHelper.GetInstance(), targetRow.ID, ho.Connection); // carregar toda a informação referente aos objetos digitais dos niveis cortados, do seu upper e do nível de destino if (SessionHelper.AppConfiguration.GetCurrentAppconfiguration().IsFedoraEnable()) { var idTipoNivelRelacionado = sources.First().IDTipoNivelRelacionado; if (idTipoNivelRelacionado == TipoNivelRelacionado.SD) // se os documentos cortados forem subdocumentos, então basta passar o nivel do pai que os subdocumentos são tb carregados DBAbstractDataLayer.DataAccessRules.FedoraRule.Current.LoadObjDigitalData(GisaDataSetHelper.GetInstance(), sources.First().IDUpper, TipoNivelRelacionado.D, ho.Connection); else sourceIDs.ForEach(ID => DBAbstractDataLayer.DataAccessRules.FedoraRule.Current.LoadObjDigitalData(GisaDataSetHelper.GetInstance(), ID, idTipoNivelRelacionado, ho.Connection)); DBAbstractDataLayer.DataAccessRules.FedoraRule.Current.LoadObjDigitalData(GisaDataSetHelper.GetInstance(), targetRow.ID, targetRow.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica().First().IDTipoNivelRelacionado, ho.Connection); } } catch (Exception ex) { Trace.WriteLine(ex.ToString()); throw ex; } finally { ho.Dispose(); } // verificar se o nivel cortado for um documento solto com vários produtores e se vai ser colado debaixo de uma série ou subsérie var docsSoltos = new StringBuilder(); sourceRows.ForEach(sourceRow => { var rhRows = sourceRow.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica(); var isDocumentoSolto = sourceRow.IDTipoNivel == TipoNivel.DOCUMENTAL && rhRows[0].NivelRowByNivelRelacaoHierarquicaUpper.IDTipoNivel == TipoNivel.ESTRUTURAL; if (isDocumentoSolto && rhRows.Count() > 1) docsSoltos.Append(sourceRow.GetNivelDesignadoRows()[0].Designacao + System.Environment.NewLine); } ); if (docsSoltos.Length > 0) { var formReport = new FormDeletionReport(); formReport.Text = "Mover nível"; formReport.Interrogacao = "As seguintes unidades informacionais recortadas têm mais do que um produtor." + System.Environment.NewLine + "Ao completar esta operação irá perder todas as relações destes níveis com os respetivos produtores." + System.Environment.NewLine + "Pretende continuar?"; formReport.Detalhes = docsSoltos.ToString(); var formResult = formReport.ShowDialog(); if (formResult == DialogResult.Cancel) return; } try { Trace.WriteLine("A colar níveis..."); var argsPc = new PersistencyHelper.LstPasteRhXPreConcArguments(); argsPc.pasteRhXPreConcArguments = new List<PersistencyHelper.PasteRhXPreConcArguments>(); argsPc.IDTipoNivelRelacionado = sources.First().IDTipoNivelRelacionado; //var argsPs = new PersistencyHelper.LstPasteRhXPreSaveArguments(); //argsPs.lstPasteRhXPreSaveArguments = new List<PersistencyHelper.PasteRhXPreSaveArguments>(); //argsPs.IDTipoNivelRelacionado = sources.First().IDTipoNivelRelacionado; // Garantir que não exista ainda a relação que se pretende criar. // Essa situação pode existir por exemplo no caso de uma série // contínua em que se tente mover uma das relações para os mesmos // dois nós já afectados pela outra relação. sourceRows.Select(r => r.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica()[0]) .Where(r => r.IDUpper != targetRow.ID) .Select(r => r.NivelRowByNivelRelacaoHierarquica).ToList() .ForEach(sourceRow => { // Actualizar localização do nível colado var rhRow = sourceRow.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica()[0]; var newrhRow = GisaDataSetHelper.GetInstance().RelacaoHierarquica.NewRelacaoHierarquicaRow(); newrhRow.ID = rhRow.ID; newrhRow.IDUpper = targetRow.ID; newrhRow.IDTipoNivelRelacionado = rhRow.IDTipoNivelRelacionado; var oldParent = rhRow.NivelRowByNivelRelacaoHierarquicaUpper; var newParent = newrhRow.NivelRowByNivelRelacaoHierarquicaUpper; if (oldParent.IDTipoNivel == TipoNivel.DOCUMENTAL && newParent.IDTipoNivel == TipoNivel.ESTRUTURAL) PermissoesHelper.AddNewNivelGrantPermissions(sourceRow); else if (oldParent.IDTipoNivel == TipoNivel.ESTRUTURAL && newParent.IDTipoNivel == TipoNivel.DOCUMENTAL) PermissoesHelper.UndoAddNivelGrantPermissions(sourceRow, PermissoesHelper.GrpAcessoCompleto); var aPc = new PersistencyHelper.PasteRhXPreConcArguments(); aPc.rhRowOldID = rhRow.ID; aPc.rhRowOldIDUpper = rhRow.IDUpper; aPc.rhRowNew = newrhRow; aPc.nivel = targetRow; aPc.ensureUniqueCodigoArgs = new PersistencyHelper.EnsureUniqueCodigoNivelPreConcArguments(); aPc.ensureUniqueCodigoArgs.nRowID = newrhRow.NivelRowByNivelRelacaoHierarquica.ID; aPc.ensureUniqueCodigoArgs.ndRowID = newrhRow.NivelRowByNivelRelacaoHierarquica.GetNivelDesignadoRows()[0].ID; aPc.ensureUniqueCodigoArgs.rhRowID = newrhRow.ID; aPc.ensureUniqueCodigoArgs.rhRowIDUpper = newrhRow.IDUpper; aPc.ensureUniqueCodigoArgs.testOnlyWithinNivel = true; argsPc.pasteRhXPreConcArguments.Add(aPc); var manageDocsPermissionsPreConcArguments = new PersistencyHelper.ManageDocsPermissionsPreConcArguments(); manageDocsPermissionsPreConcArguments.nRow = sourceRow; manageDocsPermissionsPreConcArguments.oldParentRow = rhRow.NivelRowByNivelRelacaoHierarquicaUpper; manageDocsPermissionsPreConcArguments.newParentRow = targetRow; //var pasteRhXPreSaveArguments = new PersistencyHelper.PasteRhXPreSaveArguments(); aPc.manageDocsPermissionsArgs = manageDocsPermissionsPreConcArguments; if (rhRow.IDTipoNivelRelacionado == TipoNivelRelacionado.SD) { var setNivelOrderPreConcArguments = new PersistencyHelper.SetNivelOrderPreConcArguments(); setNivelOrderPreConcArguments.nRowID = sourceRow.ID; setNivelOrderPreConcArguments.nRowIDUpper = targetRow.ID; aPc.setNivelOrderPreConcArguments = setNivelOrderPreConcArguments; } //aPc.pasteRhXPreSaveArguments = pasteRhXPreSaveArguments; //argsPs.lstPasteRhXPreSaveArguments.Add(pasteRhXPreSaveArguments); PersistencyHelper.UpdatePermissionsPostSaveArguments argsPostSave = new PersistencyHelper.UpdatePermissionsPostSaveArguments(); aPc.updatePermissionsPostSaveArgs = argsPostSave; } ); PostSaveAction postSaveAction = new PostSaveAction(); PersistencyHelper.UpdatePermissionsPostSaveArguments argPostSave = new PersistencyHelper.UpdatePermissionsPostSaveArguments(); postSaveAction.args = argPostSave; postSaveAction.postSaveDelegate = delegate(PersistencyHelper.PostSaveArguments postSaveArgs) { // registar a edição dos níveis cuja operação foi bem sucedida var noErrorArgs = argsPc.pasteRhXPreConcArguments.Where(a => a.PasteError == PersistencyHelper.PasteRhXPreConcArguments.PasteErrors.NoError).ToList(); noErrorArgs.ForEach(ID => CurrentContext.RaiseRegisterModificationEvent(ID.nivel.GetFRDBaseRows()[0])); PersistencyHelperRule.Current.saveRows(GisaDataSetHelper.GetInstance().FRDBaseDataDeDescricao, GisaDataSetHelper.GetInstance().FRDBaseDataDeDescricao.Cast<GISADataset.FRDBaseDataDeDescricaoRow>().Where(frd => frd.RowState == DataRowState.Added).ToArray(), postSaveArgs.tran); }; PersistencyHelper.SaveResult successfulSave = PersistencyHelper.save(verifyIfCanPaste, argsPc, postSaveAction, true); PersistencyHelper.cleanDeletedData(PersistencyHelper.determinaNuvem("Nivel")); mClipboardNivelItems.Clear(); ToolBarButtonPaste.Enabled = false; var nDeletedArg = argsPc.pasteRhXPreConcArguments.FirstOrDefault(a => a.PasteError == PersistencyHelper.PasteRhXPreConcArguments.PasteErrors.NDeleted); if (nDeletedArg != null) { MessageBox.Show(nDeletedArg.message, "Eliminação de nível", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } var errorAvaliacao = string.Empty; var errorRHDeleted = string.Empty; var errorNotUniqueCodigo = string.Empty; var errorNivelDeleted = string.Empty; var errorObjDigital = string.Empty; foreach (var arg in argsPc.pasteRhXPreConcArguments) { switch (arg.PasteError) { case PersistencyHelper.PasteRhXPreConcArguments.PasteErrors.Avaliacao: if (errorAvaliacao.Length == 0) errorAvaliacao += arg.message + System.Environment.NewLine; errorAvaliacao += arg.manageDocsPermissionsArgs.nRow.Codigo + " - " + arg.manageDocsPermissionsArgs.nRow.GetNivelDesignadoRows()[0].Designacao + System.Environment.NewLine; break; case PersistencyHelper.PasteRhXPreConcArguments.PasteErrors.RHDeleted: if (errorRHDeleted.Length == 0) errorRHDeleted += arg.message + System.Environment.NewLine; errorRHDeleted += arg.manageDocsPermissionsArgs.nRow.Codigo + " - " + arg.manageDocsPermissionsArgs.nRow.GetNivelDesignadoRows()[0].Designacao + System.Environment.NewLine; break; case PersistencyHelper.PasteRhXPreConcArguments.PasteErrors.NotUniqueCodigo: if (errorNotUniqueCodigo.Length == 0) errorNotUniqueCodigo += arg.message + System.Environment.NewLine; errorNotUniqueCodigo += arg.manageDocsPermissionsArgs.nRow.Codigo + " - " + arg.manageDocsPermissionsArgs.nRow.GetNivelDesignadoRows()[0].Designacao + System.Environment.NewLine; break; case PersistencyHelper.PasteRhXPreConcArguments.PasteErrors.ObjDigital: if (errorObjDigital.Length == 0) errorObjDigital += arg.message + System.Environment.NewLine; errorObjDigital += arg.manageDocsPermissionsArgs.nRow.Codigo + " - " + arg.manageDocsPermissionsArgs.nRow.GetNivelDesignadoRows()[0].Designacao + System.Environment.NewLine; break; default: if (arg.nivel.RowState == DataRowState.Detached) { if (errorNivelDeleted.Length == 0) errorNivelDeleted += arg.message + System.Environment.NewLine; errorNivelDeleted += arg.manageDocsPermissionsArgs.nRow.Codigo + " - " + arg.manageDocsPermissionsArgs.nRow.GetNivelDesignadoRows()[0].Designacao + System.Environment.NewLine; } break; } } if (errorAvaliacao.Length > 0 || errorRHDeleted.Length > 0 || errorNotUniqueCodigo.Length > 0 || errorNivelDeleted.Length > 0) { var message = "Para os níveis seguintes não foi possível completar a operação."; FormDeletionReport form = new FormDeletionReport(); form.Text = "Mover níveis"; form.Interrogacao = message; form.Detalhes = errorAvaliacao + errorRHDeleted + errorNotUniqueCodigo + errorNivelDeleted; form.SetBtnOKVisible(false); form.ShowDialog(); } // Cut/Paste de niveis documentais bem sucedidos if (successfulSave == PersistencyHelper.SaveResult.successful) { var IDs = argsPc.pasteRhXPreConcArguments.Where(a => a.PasteError == PersistencyHelper.PasteRhXPreConcArguments.PasteErrors.NoError).ToList(); // recarregar a lista de niveis if (this.nivelNavigator1.PanelToggleState == NivelNavigator.ToggleState.Documental) this.nivelNavigator1.ReloadList(); List<string> IDNiveis = new List<string>(); IDNiveis.AddRange(IDs.Select(r => r.nivel.ID.ToString())); GISA.Search.Updater.updateNivelDocumental(IDNiveis); GISA.Search.Updater.updateNivelDocumentalComProdutores(IDNiveis); // TODO: arranjar um sítio melhor para fazer a ingestão string msg = null; bool ingestSuccess = true; if (argsPc.ODsToIngest != null) argsPc.ODsToIngest.ForEach(od => ingestSuccess &= SessionHelper.AppConfiguration.GetCurrentAppconfiguration().FedoraHelperSingleton.Ingest(od, out msg)); } } catch (Exception ex) { Trace.WriteLine(ex); MessageBox.Show("Não foi possível realizar esta operação."); } }
//INSTANT C# NOTE: C# does not support optional parameters. Overloaded method(s) are created above. //ORIGINAL LINE: Public Shared Sub DeleteControloAut(ByVal caList As ControloAutList, ByVal Caption As String, ByVal Interrogacao As String, ByVal MessageBoxText As String, Optional ByVal caller As Control = null) public static void DeleteControloAut(ControloAutList caList, string Caption, string Interrogacao, string MessageBoxText, Control caller) { bool HasDocumentData = false; List<string> nivelIDsAssoc = new List<string>(); string Detalhes = null; if (caller != null) ((frmMain)caller.TopLevelControl).EnterWaitMode(); Detalhes = ControloAutHelper.GetControloAutUsage(caList.SelectedItems.Cast<ListViewItem>().Select(i => i.Tag as GISADataset.ControloAutDicionarioRow).ToList(), ref HasDocumentData, ref nivelIDsAssoc); if (caller != null) ((frmMain)caller.TopLevelControl).LeaveWaitMode(); if (Detalhes.Length > 0) { FormDeletionReport form = new FormDeletionReport(); form.Text = Caption; form.Interrogacao = Interrogacao; form.Detalhes = Detalhes; if (HasDocumentData) { form.SetBtnOKVisible(false); form.Interrogacao = "Este elemento não pode ser removido enquanto lhe existirem associados níveis documentais."; } if (form.ShowDialog() == DialogResult.Cancel) return; } else { switch (MessageBox.Show(MessageBoxText, Caption, MessageBoxButtons.OKCancel)) { case System.Windows.Forms.DialogResult.OK: break; case System.Windows.Forms.DialogResult.Cancel: return; default: Debug.Assert(false, "Unexpected DialogResult."); break; } } Trace.WriteLine("A apagar notícia de autoridade..."); ListViewItem selectedItem = null; if (caList.SelectedItems.Count > 0) { Debug.Assert(caList.SelectedItems.Count == 1, "Só deveria existir 1 item selecionado."); selectedItem = caList.SelectedItems[0]; GISADataset.ControloAutDicionarioRow cadRow = null; GISADataset.ControloAutRow caRow = null; cadRow = (GISADataset.ControloAutDicionarioRow)selectedItem.Tag; caRow = cadRow.ControloAutRow; // Remover a selecção do item vai provocar uma mudança de contexto que // por sua vez vai provocar uma gravação dos dados caList.ClearItemSelection(selectedItem); var ho = default(GisaDataSetHelper.HoldOpen); if (caller != null && caller.GetType() == typeof(MasterPanelControloAut)) { ((MasterPanelControloAut)caller).CurrentContext.RaiseRegisterModificationEvent(caRow); if (caRow.IDTipoNoticiaAut == (long)TipoNoticiaAut.EntidadeProdutora) { var frdRow = default(GISADataset.FRDBaseRow); long IDTipoNivelRelacionado = -1; ho = new GisaDataSetHelper.HoldOpen(GisaDataSetHelper.GetConnection()); try { DBAbstractDataLayer.DataAccessRules.FRDRule.Current.LoadFRD(GisaDataSetHelper.GetInstance(), caRow.GetNivelControloAutRows().Single().ID, ho.Connection); frdRow = caRow.GetNivelControloAutRows().Single().NivelRow.GetFRDBaseRows().SingleOrDefault(); DBAbstractDataLayer.DataAccessRules.NivelRule.Current.LoadNivelParents(caRow.GetNivelControloAutRows().Single().ID, GisaDataSetHelper.GetInstance(), ho.Connection); if (frdRow != null) IDTipoNivelRelacionado = DBAbstractDataLayer.DataAccessRules.NivelRule.Current.GetNivelLastIDTipoNivelRelacionado(frdRow.ID, ho.Connection); } finally { ho.Dispose(); } if (frdRow != null) // frd pode ainda não ter sido criado { var caRegRow = GisaDataSetHelper.GetInstance().ControloAutDataDeDescricao.Cast<GISADataset.ControloAutDataDeDescricaoRow>().Single(r => r.RowState == DataRowState.Added); var nvlRegRow = RecordRegisterHelper .CreateFRDBaseDataDeDescricaoRow(frdRow, caRegRow.TrusteeUserRowByTrusteeUserControloAutDataDeDescricao, caRegRow.TrusteeUserRowByTrusteeUserControloAutDataDeDescricaoAuthority, caRegRow.DataAutoria, IDTipoNivelRelacionado); nvlRegRow.DataEdicao = caRegRow.DataEdicao; GisaDataSetHelper.GetInstance().FRDBaseDataDeDescricao.AddFRDBaseDataDeDescricaoRow(nvlRegRow); } } } selectedItem.Remove(); ho = new GisaDataSetHelper.HoldOpen(GisaDataSetHelper.GetConnection()); List<long> lowerIDsList = new List<long>(); try { lowerIDsList = DiplomaModeloRule.Current.GetIDLowers(caRow.ID, ho.Connection); } finally { ho.Dispose(); } // Como os dados acabaram de ser gravados pode ter-se chegado à conclusão que o contexto existente já não existia, daí este teste if (caRow.RowState != DataRowState.Detached) { try { var oldTermo = caRow.GetControloAutDicionarioRows().Single(cad => cad.IDTipoControloAutForma == (long)TipoControloAutForma.FormaAutorizada).DicionarioRow.Termo; var IDTipoNoticiaAut = caRow.IDTipoNoticiaAut; PersistencyHelper.DeleteIDXPreSaveArguments preSaveArgs = new PersistencyHelper.DeleteIDXPreSaveArguments(); GISADataset.NivelControloAutRow[] ncaRows = null; GISADataset.NivelRow nRow = null; ncaRows = caRow.GetNivelControloAutRows(); if (ncaRows.Length > 0) { nRow = ((GISADataset.NivelControloAutRow)(ncaRows[0])).NivelRow; preSaveArgs.ID = nRow.ID; } PersistencyHelper.DeleteCAXPreConcArguments preConcArgs = DeleteCAX(caRow); PersistencyHelper.SaveResult successfulSave = PersistencyHelper.save(deleteCAXTermos, preConcArgs, Nivel.DeleteNivelXInDataBase, preSaveArgs); PersistencyHelper.cleanDeletedData(); if (successfulSave == PersistencyHelper.SaveResult.successful) { if (SessionHelper.AppConfiguration.GetCurrentAppconfiguration().IsFedoraEnable()) SessionHelper.AppConfiguration.GetCurrentAppconfiguration().FedoraHelperSingleton.ActualizaObjDigitaisPorNivel(nivelIDsAssoc, oldTermo, null, IDTipoNoticiaAut); Search.Updater.updateNivelDocumental(nivelIDsAssoc); Search.Updater.updateNivelDocumentalComProdutores(lowerIDsList.Select(t => t.ToString()).ToList<string>()); } } catch (Exception ex) { Trace.WriteLine(ex); throw; } } else GisaDataSetHelper.GetInstance().ControloAutDataDeDescricao.Cast<GISADataset.ControloAutDataDeDescricaoRow>().Single(r => r.RowState == DataRowState.Added && r.IDControloAut == caRow.ID).RejectChanges(); } }