private void DuplicateUF() { if (!ValidateSelection()) return; GISADataset.NivelRow nufRow = (GISADataset.NivelRow)(ufList.SelectedItems[0].Tag); //forçar uma mudança de contexto para que a unidade física seleccionada seja gravada ufList.ClearItemSelection(ufList.SelectedItems[0]); //testar se a unidade física não foi apagada por outro utilizador entretanto if (nufRow == null || nufRow.RowState == DataRowState.Detached) { MessageBox.Show("A unidade física a ser duplicada foi eliminada por outro utilizador " + System.Environment.NewLine + "pelo que a operação não pode ser concluída.", "Duplicação da unidade física", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } Trace.WriteLine("A duplicar unidade física id: " + nufRow.ID); PersistencyHelper.AddEditUFPreConcArguments argsPC = new PersistencyHelper.AddEditUFPreConcArguments(); PersistencyHelper.IsCodigoUFBeingUsedPreSaveArguments argsPS = new PersistencyHelper.IsCodigoUFBeingUsedPreSaveArguments(); //carregar toda a informação da unidade física a ser duplicada GisaDataSetHelper.HoldOpen ho = new GisaDataSetHelper.HoldOpen(GisaDataSetHelper.GetConnection()); try { GisaDataSetHelper.ManageDatasetConstraints(false); DBAbstractDataLayer.DataAccessRules.UFRule.Current.LoadUF(GisaDataSetHelper.GetInstance(), nufRow.ID, ho.Connection); } catch (Exception ex) { Trace.WriteLine(ex.ToString()); throw; } finally { ho.Dispose(); GisaDataSetHelper.ManageDatasetConstraints(true); } //duplicar uf seleccionada GISADataset.TipoNivelRelacionadoRow tnrRow = (GISADataset.TipoNivelRelacionadoRow)(GisaDataSetHelper.GetInstance().TipoNivelRelacionado. Select(string.Format("ID={0}", TipoNivelRelacionado.UF))[0]); GISADataset.NivelDesignadoRow ndufRow = nufRow.GetNivelDesignadoRows()[0]; GISADataset.NivelUnidadeFisicaRow nivelUFRow = ndufRow.GetNivelUnidadeFisicaRows()[0]; GISADataset.RelacaoHierarquicaRow rhufRow = nufRow.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica()[0]; GISADataset.NivelRow nedRow = rhufRow.NivelRowByNivelRelacaoHierarquicaUpper; GISADataset.FRDBaseRow[] frdufRows = nufRow.GetFRDBaseRows(); GISADataset.FRDBaseRow newfrdufRow = null; GISADataset.LocalConsultaRow newLocalConsultaRow = nivelUFRow.IsIDLocalConsultaNull() ? null : nivelUFRow.LocalConsultaRow; GISADataset.NivelRow newNufRow = GisaDataSetHelper.GetInstance().Nivel.AddNivelRow(nufRow.TipoNivelRow, nufRow.Codigo, nufRow.CatCode, new byte[]{}, 0); ndufRow = GisaDataSetHelper.GetInstance().NivelDesignado.AddNivelDesignadoRow(newNufRow, ndufRow.Designacao, new byte[]{}, 0); GISADataset.TipoEntregaRow teRow = null; if (!nivelUFRow.IsIDTipoEntregaNull()) teRow = (GISADataset.TipoEntregaRow) (GisaDataSetHelper.GetInstance().TipoEntrega.Select("ID=" + nivelUFRow.IDTipoEntrega)[0]); nivelUFRow = GisaDataSetHelper.GetInstance().NivelUnidadeFisica.AddNivelUnidadeFisicaRow(ndufRow, GisaDataSetHelper.GetDBNullableText(nivelUFRow, "GuiaIncorporacao"), GisaDataSetHelper.GetDBNullableText(nivelUFRow, "CodigoBarras"), new byte[] { }, 0, false, teRow, newLocalConsultaRow); rhufRow = GisaDataSetHelper.GetInstance().RelacaoHierarquica.AddRelacaoHierarquicaRow(newNufRow, nedRow, tnrRow, GisaDataSetHelper.GetDBNullableText(rhufRow, "Descricao"), GisaDataSetHelper.GetDBNullableText(rhufRow, "InicioAno"), GisaDataSetHelper.GetDBNullableText(rhufRow, "InicioMes"), GisaDataSetHelper.GetDBNullableText(rhufRow, "InicioDia"), GisaDataSetHelper.GetDBNullableText(rhufRow, "FimAno"), GisaDataSetHelper.GetDBNullableText(rhufRow, "FimMes"), GisaDataSetHelper.GetDBNullableText(rhufRow, "FimDia"), new byte[]{}, 0); GISADataset.SFRDDatasProducaoRow dpufRow = null; GISADataset.SFRDUFCotaRow cufRow = null; GISADataset.SFRDConteudoEEstruturaRow conteudoufRow = null; GISADataset.SFRDDatasProducaoRow[] dpufRows; GISADataset.SFRDUFCotaRow[] cufRows; GISADataset.SFRDConteudoEEstruturaRow[] conteudoufRows; GISADataset.SFRDUFDescricaoFisicaRow[] descricaoFisicaRows; GISADataset.SFRDUFDescricaoFisicaRow newDescricaoFisicaRow = null; if (frdufRows.Length > 0) { newfrdufRow = GisaDataSetHelper.GetInstance().FRDBase.AddFRDBaseRow(newNufRow, frdufRows[0].TipoFRDBaseRow, GisaDataSetHelper.GetDBNullableText(frdufRows[0], "NotaDoArquivista"), GisaDataSetHelper.GetDBNullableText(frdufRows[0], "RegrasOuConvencoes"), new byte[]{}, 0); argsPC.frdufRowID = newfrdufRow.ID; dpufRows = frdufRows[0].GetSFRDDatasProducaoRows(); cufRows = frdufRows[0].GetSFRDUFCotaRows(); conteudoufRows = frdufRows[0].GetSFRDConteudoEEstruturaRows(); descricaoFisicaRows = frdufRows[0].GetSFRDUFDescricaoFisicaRows(); if (dpufRows.Length > 0) dpufRow = GisaDataSetHelper.GetInstance().SFRDDatasProducao.AddSFRDDatasProducaoRow( newfrdufRow, GisaDataSetHelper.GetDBNullableText(dpufRows[0], "InicioTexto"), GisaDataSetHelper.GetDBNullableText(dpufRows[0], "InicioAno"), GisaDataSetHelper.GetDBNullableText(dpufRows[0], "InicioMes"), GisaDataSetHelper.GetDBNullableText(dpufRows[0], "InicioDia"), dpufRows[0].InicioAtribuida, GisaDataSetHelper.GetDBNullableText(dpufRows[0], "FimTexto"), GisaDataSetHelper.GetDBNullableText(dpufRows[0], "FimAno"), GisaDataSetHelper.GetDBNullableText(dpufRows[0], "FimMes"), GisaDataSetHelper.GetDBNullableText(dpufRows[0], "FimDia"), dpufRows[0].FimAtribuida, new byte[] { }, 0); if (cufRows.Length > 0) cufRow = GisaDataSetHelper.GetInstance().SFRDUFCota.AddSFRDUFCotaRow( newfrdufRow, GisaDataSetHelper.GetDBNullableText(cufRows[0], "Cota"), new byte[]{}, 0); if (conteudoufRows.Length > 0) conteudoufRow = GisaDataSetHelper.GetInstance().SFRDConteudoEEstrutura.AddSFRDConteudoEEstruturaRow( newfrdufRow, GisaDataSetHelper.GetDBNullableText(conteudoufRows[0], "ConteudoInformacional"), GisaDataSetHelper.GetDBNullableText(conteudoufRows[0], "Incorporacao"), new byte[]{}, 0); newDescricaoFisicaRow = GisaDataSetHelper.GetInstance().SFRDUFDescricaoFisica.NewSFRDUFDescricaoFisicaRow(); newDescricaoFisicaRow.FRDBaseRow = newfrdufRow; if (descricaoFisicaRows.Length > 0) { newDescricaoFisicaRow.TipoAcondicionamentoRow = descricaoFisicaRows[0].TipoAcondicionamentoRow; newDescricaoFisicaRow.TipoMedidaRow = descricaoFisicaRows[0].TipoMedidaRow; newDescricaoFisicaRow.Versao = new byte[] { }; newDescricaoFisicaRow.isDeleted = 0; if (!(descricaoFisicaRows[0]["MedidaLargura"] == DBNull.Value)) newDescricaoFisicaRow.MedidaLargura = descricaoFisicaRows[0].MedidaLargura; if (!(descricaoFisicaRows[0]["MedidaAltura"] == DBNull.Value)) newDescricaoFisicaRow.MedidaAltura = descricaoFisicaRows[0].MedidaAltura; if (!(descricaoFisicaRows[0]["MedidaProfundidade"] == DBNull.Value)) newDescricaoFisicaRow.MedidaProfundidade = descricaoFisicaRows[0].MedidaProfundidade; } GisaDataSetHelper.GetInstance().SFRDUFDescricaoFisica.AddSFRDUFDescricaoFisicaRow(newDescricaoFisicaRow); } List<long> uaAssociadas = new List<long>(); foreach (GISADataset.SFRDUnidadeFisicaRow sfrdUA in nufRow.GetSFRDUnidadeFisicaRows()) { GisaDataSetHelper.GetInstance().SFRDUnidadeFisica.AddSFRDUnidadeFisicaRow(sfrdUA.FRDBaseRow, newNufRow, null, new byte[]{}, 0); uaAssociadas.Add(sfrdUA.FRDBaseRow.ID); } argsPC.Operation = PersistencyHelper.AddEditUFPreConcArguments.Operations.CreateLike; argsPC.nivelUFRowID = newNufRow.ID; argsPC.ndufRowID = ndufRow.ID; argsPC.rhufRowID = rhufRow.ID; argsPC.rhufRowIDUpper = rhufRow.IDUpper; argsPC.nufufRowID = nivelUFRow.ID; argsPC.uaAssociadas = uaAssociadas; argsPS.nivelUFRowID = nivelUFRow.ID; argsPC.psa = argsPS; var postSaveAction = new PostSaveAction(); PersistencyHelper.UpdatePermissionsPostSaveArguments args = new PersistencyHelper.UpdatePermissionsPostSaveArguments(); postSaveAction.args = args; postSaveAction.postSaveDelegate = delegate(PersistencyHelper.PostSaveArguments postSaveArgs) { if (!postSaveArgs.cancelAction && argsPC.OperationError == PersistencyHelper.AddEditUFPreConcArguments.OperationErrors.NoError) { CurrentContext.RaiseRegisterModificationEvent(newfrdufRow); 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(DelegatesHelper.HandleUF, argsPC, DelegatesHelper.SetCodigo, argsPS, postSaveAction); PersistencyHelper.cleanDeletedData(PersistencyHelper.determinaNuvem("NivelUnidadeFisica")); try { if (argsPC.OperationError == PersistencyHelper.AddEditUFPreConcArguments.OperationErrors.NewUF) { MessageBox.Show(argsPC.message, "Criar unidade física", MessageBoxButtons.OK, MessageBoxIcon.Warning); } else { // adicionar a unidade física à lista ufList.AddNivel(newNufRow); // actualizar o índice if (successfulSave == PersistencyHelper.SaveResult.successful) { ho = new GisaDataSetHelper.HoldOpen(GisaDataSetHelper.GetConnection()); try { List<string> IDNiveis = DBAbstractDataLayer.DataAccessRules.UFRule.Current.GetNiveisDocAssociados(newNufRow.ID, ho.Connection); GISA.Search.Updater.updateNivelDocumental(IDNiveis); GISA.Search.Updater.updateUnidadeFisica(newfrdufRow.NivelRow.ID); } catch (Exception ex) { Trace.WriteLine(ex.ToString()); throw; } finally { ho.Dispose(); } } } } catch (Exception ex) { Trace.WriteLine("Exception while refreshing data: " + ex.ToString()); throw; } }
private void ShowUFDialog(bool CreateNew) { GISADataset.TipoNivelRelacionadoRow tnrRow = (GISADataset.TipoNivelRelacionadoRow)(GisaDataSetHelper.GetInstance().TipoNivelRelacionado. Select(string.Format("ID={0}", TipoNivelRelacionado.UF))[0]); GISADataset.NivelRow nufRow = null; GISADataset.NivelDesignadoRow ndufRow = null; GISADataset.NivelDesignadoRow ndedRow = null; GISADataset.RelacaoHierarquicaRow rhufRow = null; GISADataset.NivelUnidadeFisicaRow nufufRow = null; GISADataset.FRDBaseRow frdufRow = null; GISADataset.SFRDUFCotaRow cota = null; GISADataset.SFRDUFDescricaoFisicaRow df = null; GISADataset.SFRDDatasProducaoRow dp = null; GISADataset.SFRDConteudoEEstruturaRow ce = null; List<GISADataset.NivelDesignadoRow> edsNdRRows = null; if (CreateNew && ((frmMain)TopLevelControl).isSuportPanel && !PersistencyHelper.hasCurrentDatasetChanges()) { try { Trace.WriteLine("Saving before creating new UF in suport panel..."); PersistencyHelper.save(); PersistencyHelper.cleanDeletedData(); } catch (Exception) { MessageBox.Show("Ocorreu um erro ao tentar abrir o formulário de criação." + System.Environment.NewLine + "Por favor contacte o administrador de sistema.", "Criação de unidade física", MessageBoxButtons.OK, MessageBoxIcon.Warning); } using (GisaDataSetHelper.HoldOpen ho = new GisaDataSetHelper.HoldOpen(GisaDataSetHelper.GetConnection())) { if (CurrentContext.NivelEstrututalDocumental == null) { MessageBox.Show("Ocorreu um erro ao tentar abrir o formulário de criação." + System.Environment.NewLine + "Por favor contacte o administrador de sistema.", "Criação de unidade física", MessageBoxButtons.OK, MessageBoxIcon.Warning); Trace.WriteLine("Pincipal context not found!!"); return; } DBAbstractDataLayer.DataAccessRules.NivelRule.Current.LoadEntidadesDetentoras(GisaDataSetHelper.GetInstance(), ho.Connection); var edsIds = UFRule.Current.GetEntidadeDetentoraForNivel(CurrentContext.NivelEstrututalDocumental.ID, ho.Connection); var ndRows=GisaDataSetHelper.GetInstance().NivelDesignado.Cast<GISADataset.NivelDesignadoRow>().Where(r=>r.RowState != DataRowState.Deleted); edsNdRRows = edsIds.Cast<long>().Select(id => ndRows.Single(r=>r.ID==id)).ToList(); } } using (GisaDataSetHelper.HoldOpen ho = new GisaDataSetHelper.HoldOpen(GisaDataSetHelper.GetConnection())) { GisaDataSetHelper.ManageDatasetConstraints(false); DBAbstractDataLayer.DataAccessRules.NivelRule.Current.LoadUFsRelatedData(GisaDataSetHelper.GetInstance(), ho.Connection); GisaDataSetHelper.ManageDatasetConstraints(true); } PersistencyHelper.AddEditUFPreConcArguments argsPC = new PersistencyHelper.AddEditUFPreConcArguments(); PersistencyHelper.IsCodigoUFBeingUsedPreSaveArguments argsPS = new PersistencyHelper.IsCodigoUFBeingUsedPreSaveArguments(); FormCreateUF frm = new FormCreateUF(); if (CreateNew) { argsPC.Operation = PersistencyHelper.AddEditUFPreConcArguments.Operations.Create; // nivel nufRow = GisaDataSetHelper.GetInstance().Nivel.NewNivelRow(); // nivelDesignado ndufRow = GisaDataSetHelper.GetInstance().NivelDesignado.NewNivelDesignadoRow(); // RelacaoHierarquica rhufRow = GisaDataSetHelper.GetInstance().RelacaoHierarquica.NewRelacaoHierarquicaRow(); // NivelUnidadeFisicaRow nufufRow = GisaDataSetHelper.GetInstance().NivelUnidadeFisica.NewNivelUnidadeFisicaRow(); // FRDBaseRow frdufRow = GisaDataSetHelper.GetInstance().FRDBase.NewFRDBaseRow(); // nivel da entidade detentora ndedRow = null; cota = GisaDataSetHelper.GetInstance().SFRDUFCota.NewSFRDUFCotaRow(); df = GisaDataSetHelper.GetInstance().SFRDUFDescricaoFisica.NewSFRDUFDescricaoFisicaRow(); dp = GisaDataSetHelper.GetInstance().SFRDDatasProducao.NewSFRDDatasProducaoRow(); ce = GisaDataSetHelper.GetInstance().SFRDConteudoEEstrutura.NewSFRDConteudoEEstruturaRow(); frm.Text = "Criar " + tnrRow.Designacao; if (CreateNew && ((frmMain)TopLevelControl).isSuportPanel && !PersistencyHelper.hasCurrentDatasetChanges()) frm.EntidadeDetentoraList = edsNdRRows; frm.ReloadData(); foreach (GISADataset.NivelDesignadoRow row in frm.cbEntidadeDetentora.Items) { if (row.ID == ShowUFDialog_edID) { frm.cbEntidadeDetentora.SelectedItem = row; break; } } frm.txtDesignacao.Text = ShowUFDialog_designacao; frm.txtDesignacao.SelectAll(); } else { if (ufList.SelectedItems.Count == 0) { return; } if (((GISADataset.NivelRow)(ufList.SelectedItems[0].Tag)).RowState == DataRowState.Detached) { MessageBox.Show("Não é possível editar a unidade física selecionada " + System.Environment.NewLine + "uma vez que foi apagada por outro utilizador.", "Edição de unidades físicas", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } argsPC.Operation = PersistencyHelper.AddEditUFPreConcArguments.Operations.Edit; // nivel nufRow = (GISADataset.NivelRow)(ufList.SelectedItems[0].Tag); argsPC.nivelUFRowID = nufRow.ID; // nivelDesignado ndufRow = nufRow.GetNivelDesignadoRows()[0]; argsPC.ndufRowID = ndufRow.ID; // RelacaoHierarquica rhufRow = nufRow.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica()[0]; argsPC.rhufRowID = rhufRow.ID; argsPC.rhufRowIDUpper = rhufRow.IDUpper; // NivelUnidadeFisicaRow if (ndufRow.GetNivelUnidadeFisicaRows().Length > 0) nufufRow = ndufRow.GetNivelUnidadeFisicaRows()[0]; else { // via conversão de dados esta linha pode não ser criada, mas pela aplicação é garantido que a row é criada nufufRow = GisaDataSetHelper.GetInstance().NivelUnidadeFisica.NewNivelUnidadeFisicaRow(); nufufRow.GuiaIncorporacao = ""; nufufRow.NivelDesignadoRow = ndufRow; nufufRow.isDeleted = 0; GisaDataSetHelper.GetInstance().NivelUnidadeFisica.AddNivelUnidadeFisicaRow(nufufRow); } argsPC.nufufRowID = nufufRow.ID; // nivel da entidade detentora ndedRow = rhufRow.NivelRowByNivelRelacaoHierarquicaUpper.GetNivelDesignadoRows()[0]; frm.Text = "Editar " + tnrRow.Designacao; frm.ReloadData(); frm.EntidadeDetentora = ndedRow; frm.NivelDesignado = ndufRow; frm.Codigo = nufRow.Codigo; frdufRow = nufRow.GetFRDBaseRows().First(); } switch (frm.ShowDialog()) { case DialogResult.OK: ndufRow.Designacao = frm.Designacao; List<string> uaAssociadas = new List<string>(); if (CreateNew) { Trace.WriteLine("A criar unidade física..."); nufRow.TipoNivelRow = tnrRow.TipoNivelRow; nufRow.Codigo = frm.Codigo; nufRow.CatCode = "NVL"; ndufRow.NivelRow = nufRow; ndufRow.Designacao = frm.Designacao; ShowUFDialog_edID = frm.EntidadeDetentora.ID; ShowUFDialog_designacao = frm.Designacao; rhufRow.NivelRowByNivelRelacaoHierarquica = nufRow; rhufRow.TipoNivelRelacionadoRow = tnrRow; rhufRow["InicioAno"] = DBNull.Value; rhufRow["InicioMes"] = DBNull.Value; rhufRow["InicioDia"] = DBNull.Value; rhufRow["FimAno"] = DBNull.Value; rhufRow["FimMes"] = DBNull.Value; rhufRow["FimDia"] = DBNull.Value; rhufRow.NivelRowByNivelRelacaoHierarquicaUpper = frm.EntidadeDetentora.NivelRow; nufufRow.NivelDesignadoRow = ndufRow; frdufRow.NivelRow = nufRow; frdufRow.NotaDoArquivista = string.Empty; frdufRow.TipoFRDBaseRow = (GISADataset.TipoFRDBaseRow)(GisaDataSetHelper.GetInstance().TipoFRDBase.Select(string.Format("ID={0}", System.Enum.Format(typeof(TipoFRDBase), TipoFRDBase.FRDUnidadeFisica, "D")))[0]); frdufRow.RegrasOuConvencoes = string.Empty; cota.FRDBaseRow = frdufRow; cota.Cota = string.Empty; df.FRDBaseRow = frdufRow; df.IDTipoMedida = 1; df.TipoAcondicionamentoRow = (GISADataset.TipoAcondicionamentoRow)(GisaDataSetHelper.GetInstance().TipoAcondicionamento.Select(string.Format("ID={0:d}", TipoAcondicionamento.Pasta))[0]); dp.FRDBaseRow = frdufRow; dp.FimAno = string.Empty; dp.FimMes = string.Empty; dp.FimDia = string.Empty; dp.FimAtribuida = false; dp.InicioAno = string.Empty; dp.InicioMes = string.Empty; dp.InicioDia = string.Empty; dp.InicioAtribuida = false; ce.FRDBaseRow = frdufRow; ce.ConteudoInformacional = string.Empty; ce.Incorporacao = string.Empty; GisaDataSetHelper.GetInstance().Nivel.AddNivelRow(nufRow); GisaDataSetHelper.GetInstance().NivelDesignado.AddNivelDesignadoRow(ndufRow); GisaDataSetHelper.GetInstance().RelacaoHierarquica.AddRelacaoHierarquicaRow(rhufRow); GisaDataSetHelper.GetInstance().NivelUnidadeFisica.AddNivelUnidadeFisicaRow(nufufRow); GisaDataSetHelper.GetInstance().FRDBase.AddFRDBaseRow(frdufRow); GisaDataSetHelper.GetInstance().SFRDUFCota.AddSFRDUFCotaRow(cota); GisaDataSetHelper.GetInstance().SFRDUFDescricaoFisica.AddSFRDUFDescricaoFisicaRow(df); GisaDataSetHelper.GetInstance().SFRDDatasProducao.AddSFRDDatasProducaoRow(dp); GisaDataSetHelper.GetInstance().SFRDConteudoEEstrutura.AddSFRDConteudoEEstruturaRow(ce); argsPC.nivelUFRowID = nufRow.ID; argsPC.ndufRowID = ndufRow.ID; argsPC.rhufRowID = rhufRow.ID; argsPC.rhufRowIDUpper = rhufRow.IDUpper; argsPC.nufufRowID = nufufRow.ID; argsPC.frdufRowID = frdufRow.ID; } else { // se a entidade detentora da unidade fisica for alterada // é necessário actualizar o Codigo if (frm.EntidadeDetentora.ID != ndedRow.ID) { var uasInfo = new List<UnidadesFisicasHelper.UaInfo>(); var res = MessageBox.Show("A entidade detentora foi alterada. Por essa razão será " + "atribuído um novo código a esta unidade física. Deseja prosseguir?", "Edição da unidade física", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); // switch (ConfirmCascadeDeletion("A entidade detentora foi alterada. Por essa razão será " + "atribuído um novo código a esta unidade física. Deseja prosseguir?", "A entidade detentora foi alterada. Por essa razão será " + "atribuído um novo código a esta unidade física " + "e as referências existentes serão perdidas." + "Deseja prosseguir?", nufRow, ref uaAssociadas, ref uasInfo)) switch (res) { case DialogResult.OK: case DialogResult.Yes: Trace.WriteLine("A editar unidade física..."); nufRow.Codigo = frm.Codigo; //nova RelacaoHierarquicaRow GISADataset.RelacaoHierarquicaRow newRhufRow = null; newRhufRow = GisaDataSetHelper.GetInstance().RelacaoHierarquica.NewRelacaoHierarquicaRow(); newRhufRow.ID = rhufRow.ID; newRhufRow.NivelRowByNivelRelacaoHierarquicaUpper = frm.EntidadeDetentora.NivelRow; newRhufRow.IDTipoNivelRelacionado = rhufRow.IDTipoNivelRelacionado; GisaDataSetHelper.GetInstance().RelacaoHierarquica.AddRelacaoHierarquicaRow(newRhufRow); argsPC.newRhufRowID = newRhufRow.ID; argsPC.newRhufRowIDUpper = newRhufRow.IDUpper; argsPC.nufufRowID = nufufRow.ID; //apagar a relacao antiga rhufRow.Delete(); break; case DialogResult.Cancel: case DialogResult.No: // cancelar toda a operação de edição MessageBox.Show("A unidade física não foi alterada.", "Edição da unidade física"); // FIXME: exit sub? return; } } } argsPS.nivelUFRowID = nufufRow.ID; argsPC.psa = argsPS; var postSaveAction = new PostSaveAction(); var argsPostSave = new PersistencyHelper.UpdatePermissionsPostSaveArguments(); postSaveAction.args = argsPostSave; postSaveAction.postSaveDelegate = delegate(PersistencyHelper.PostSaveArguments postSaveArgs) { if (!postSaveArgs.cancelAction && argsPC.OperationError == PersistencyHelper.AddEditUFPreConcArguments.OperationErrors.NoError) { if (CreateNew && ((frmMain)TopLevelControl).isSuportPanel) { GISADataset.TrusteeUserRow tuAuthorRow = null; if (SessionHelper.GetGisaPrincipal().TrusteeUserAuthor != null && !(SessionHelper.GetGisaPrincipal().TrusteeUserAuthor.RowState == DataRowState.Detached)) tuAuthorRow = SessionHelper.GetGisaPrincipal().TrusteeUserAuthor; var r = GISA.Model.RecordRegisterHelper.CreateFRDBaseDataDeDescricaoRow(frdufRow, SessionHelper.GetGisaPrincipal().TrusteeUserOperator, tuAuthorRow, DateTime.Now); GisaDataSetHelper.GetInstance().FRDBaseDataDeDescricao.AddFRDBaseDataDeDescricaoRow(r); } else CurrentContext.RaiseRegisterModificationEvent(frdufRow); 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(DelegatesHelper.HandleUF, argsPC, DelegatesHelper.SetCodigo, argsPS, postSaveAction); PersistencyHelper.cleanDeletedData(PersistencyHelper.determinaNuvem("NivelUnidadeFisica")); try { if (CreateNew) { if (argsPC.OperationError == PersistencyHelper.AddEditUFPreConcArguments.OperationErrors.NewUF) { MessageBox.Show(argsPC.message, "Criar unidade física", MessageBoxButtons.OK, MessageBoxIcon.Warning); } else { // adicionar unidade física à lista ufList.AddNivel(nufRow); if (successfulSave == PersistencyHelper.SaveResult.successful) { GISA.Search.Updater.updateNivelDocumental(uaAssociadas); GISA.Search.Updater.updateUnidadeFisica(frdufRow.NivelRow.ID); } } } else { if (argsPC.OperationError == PersistencyHelper.AddEditUFPreConcArguments.OperationErrors.EditEDAndDesignacao) { MessageBox.Show(argsPC.message, "Editar unidade física", MessageBoxButtons.OK, MessageBoxIcon.Warning); ufList.ClearItemSelection(ufList.SelectedItems[0]); } else if (argsPC.OperationError == PersistencyHelper.AddEditUFPreConcArguments.OperationErrors.EditNewEd) { MessageBox.Show(argsPC.message, "Editar unidade física", MessageBoxButtons.OK, MessageBoxIcon.Warning); } else if (argsPC.OperationError == PersistencyHelper.AddEditUFPreConcArguments.OperationErrors.EditOriginalEd) { MessageBox.Show(argsPC.message, "Editar unidade física", MessageBoxButtons.OK, MessageBoxIcon.Warning); // recarregar a UF de forma a actualizar a sua informação ListViewItem lvItem = ufList.SelectedItems[0]; ufList.ClearItemSelection(lvItem); ufList.SelectItem(lvItem); ufList.UpdateNivel(ufList.SelectedItems[0]); } else { ufList.UpdateNivel(ufList.SelectedItems[0]); frdufRow = ((GISADataset.NivelRow)ufList.SelectedItems[0].Tag).GetFRDBaseRows()[0]; if (successfulSave == PersistencyHelper.SaveResult.successful) { GISA.Search.Updater.updateNivelDocumental(uaAssociadas); GISA.Search.Updater.updateUnidadeFisica(frdufRow.NivelRow.ID); } // force a context update so that lower panel gets updated CurrentContext.SetNivelUnidadeFisica(null); UpdateContext(); } } } catch (Exception ex) { Trace.WriteLine("Exception while refreshing data: " + ex.ToString()); throw; } break; } }
private bool validateData() { GISADataset.ControloAutDicionarioRow cadRow = ControloAutDicionarioAutorizado; GISADataset.TipoControloAutRelRow tcarRow = null; tcarRow = (GISADataset.TipoControloAutRelRow)relacaoCA.cbTipoControloAutRel.SelectedItem; PersistencyHelper.VerifyRelExistencePreConcArguments pcArgs = new PersistencyHelper.VerifyRelExistencePreConcArguments(); IDbConnection conn = GisaDataSetHelper.GetConnection(); try { conn.Open(); DBAbstractDataLayer.DataAccessRules.NivelRule.Current.LoadNivelByControloAut(cadRow.IDControloAut, GisaDataSetHelper.GetInstance(), conn); } catch (Exception ex) { Trace.WriteLine(ex); throw ex; } finally { conn.Close(); } string errorTitle = "Erro ao estabelecer relação"; if (! mInEditMode) { // Garantir que uma EP não é relacionada com ela própria. if (cadRow.ControloAutRow.ID == ContextControloAut.ID) { MessageBox.Show("Não é permitido relacionar uma notícia de autoridade consigo própria.", errorTitle, MessageBoxButtons.OK, MessageBoxIcon.Warning); return false; } // validar que a relação que pretendemos criar ainda não existe if (GisaDataSetHelper.GetInstance().ControloAutRel.Select(string.Format("((IDControloAut={0} AND IDControloAutAlias={1}) OR (IDControloAut={1} AND IDControloAutAlias={0})) AND IDTipoRel = {2:d}", cadRow.ControloAutRow.ID, ContextControloAut.ID, tcarRow.ID)).Length > 0 || (tcarRow.ID == Convert.ToInt64(TipoControloAutRel.Hierarquica) && GisaDataSetHelper.GetInstance().RelacaoHierarquica.Select(string.Format("ID={0} AND IDUpper={1} OR ID={1} AND IDUpper={0}", cadRow.ControloAutRow.GetNivelControloAutRows()[0].NivelRow.ID, ContextControloAut.GetNivelControloAutRows()[0].NivelRow.ID)).Length > 0)) { MessageBox.Show("Não é permitida mais que uma relação do mesmo tipo " + Environment.NewLine + "entre as mesmas duas entidades produtoras.", errorTitle, MessageBoxButtons.OK, MessageBoxIcon.Warning); return false; } //Agir de forma diferente conforme seja uma relação hierarquica ou seja uma relação de outro qualquer tipo if (tcarRow.ID == Convert.ToInt64(TipoControloAutRel.Hierarquica)) { // Carregar informação do Nível do CA com que se pretende estabelecer esta relação GisaDataSetHelper.HoldOpen ho = new GisaDataSetHelper.HoldOpen(GisaDataSetHelper.GetConnection()); try { DBAbstractDataLayer.DataAccessRules.FRDRule.Current.LoadRetrieveSelectionData(GisaDataSetHelper.GetInstance(), cadRow.IDControloAut, ho.Connection); DBAbstractDataLayer.DataAccessRules.FRDRule.Current.LoadFRD(GisaDataSetHelper.GetInstance(), ContextControloAut.GetNivelControloAutRows()[0].NivelRow.ID, ho.Connection); } finally { ho.Dispose(); } long tnrID = 0; tnrID = ((TipoNivelRelacionado.PossibleSubNivel)relacaoCA.cbTipoNivel.SelectedItem).SubIDTipoNivelRelacionado; GISADataset.RelacaoHierarquicaRow rhRow = null; rhRow = GisaDataSetHelper.GetInstance().RelacaoHierarquica.NewRelacaoHierarquicaRow(); rhRow.IDUpper = cadRow.ControloAutRow.GetNivelControloAutRows()[0].NivelRow.ID; rhRow.ID = ContextControloAut.GetNivelControloAutRows()[0].NivelRow.ID; rhRow.IDTipoNivelRelacionado = tnrID; // Guardar datas rhRow.InicioAno = GISA.Utils.GUIHelper.ReadYear(relacaoCA.dtRelacaoInicio.ValueYear); rhRow.InicioMes = GISA.Utils.GUIHelper.ReadMonth(relacaoCA.dtRelacaoInicio.ValueMonth); rhRow.InicioDia = GISA.Utils.GUIHelper.ReadDay(relacaoCA.dtRelacaoInicio.ValueDay); rhRow.FimAno = GISA.Utils.GUIHelper.ReadYear(relacaoCA.dtRelacaoFim.ValueYear); rhRow.FimMes = GISA.Utils.GUIHelper.ReadMonth(relacaoCA.dtRelacaoFim.ValueMonth); rhRow.FimDia = GISA.Utils.GUIHelper.ReadDay(relacaoCA.dtRelacaoFim.ValueDay); rhRow.Descricao = relacaoCA.txtDescricao.Text; //rhRow.isDeleted = 0; GisaDataSetHelper.GetInstance().RelacaoHierarquica.AddRelacaoHierarquicaRow(rhRow); pcArgs.ID = rhRow.ID; pcArgs.IDUpper = rhRow.IDUpper; pcArgs.IDTipoRel = rhRow.IDTipoNivelRelacionado; pcArgs.isCARRow = false; // actualizar permissões implícitas var postSaveAction = new PostSaveAction(); PersistencyHelper.UpdatePermissionsPostSaveArguments args = new PersistencyHelper.UpdatePermissionsPostSaveArguments(); postSaveAction.args = args; postSaveAction.postSaveDelegate = delegate(PersistencyHelper.PostSaveArguments postSaveArgs) { if (!postSaveArgs.cancelAction && ContextControloAut.RowState != DataRowState.Detached && pcArgs.CreateEditResult == PersistencyHelper.VerifyRelExistencePreConcArguments.CreateEditRelationErrors.NoError) { if (this.parent.GetType() == typeof(MasterPanelControloAut)) { ((MasterPanelControloAut)this.parent).CurrentContext.RaiseRegisterModificationEvent(this.ContextControloAut); var caRegRow = GisaDataSetHelper.GetInstance().ControloAutDataDeDescricao.Cast<GISADataset.ControloAutDataDeDescricaoRow>().Single(r => r.RowState == DataRowState.Added); PersistencyHelperRule.Current.saveRows(GisaDataSetHelper.GetInstance().ControloAutDataDeDescricao, new GISADataset.ControloAutDataDeDescricaoRow[] { caRegRow }, postSaveArgs.tran); var frdRow = rhRow.NivelRowByNivelRelacaoHierarquica.GetFRDBaseRows().SingleOrDefault(); if (frdRow == null) { var tipoFRD = (GISADataset.TipoFRDBaseRow)(GisaDataSetHelper.GetInstance().TipoFRDBase.Select("ID=" + DomainValuesHelper.stringifyEnumValue(TipoFRDBase.FRDOIRecolha))[0]); frdRow = GisaDataSetHelper.GetInstance().FRDBase.AddFRDBaseRow(rhRow.NivelRowByNivelRelacaoHierarquica, tipoFRD, "", "", new byte[] { }, 0); var dp = GisaDataSetHelper.GetInstance().SFRDDatasProducao.AddSFRDDatasProducaoRow(frdRow, "", "", "", "", false, "", "", "", "", false, new byte[] { }, 0); var ce = GisaDataSetHelper.GetInstance().SFRDConteudoEEstrutura.AddSFRDConteudoEEstruturaRow(frdRow, "", "", new byte[] { }, 0); var c = GisaDataSetHelper.GetInstance().SFRDContexto.AddSFRDContextoRow(frdRow, "", "", "", false, new byte[] { }, 0); var da = GisaDataSetHelper.GetInstance().SFRDDocumentacaoAssociada.AddSFRDDocumentacaoAssociadaRow(frdRow, "", "", "", "", new byte[] { }, 0); var ds = GisaDataSetHelper.GetInstance().SFRDDimensaoSuporte.AddSFRDDimensaoSuporteRow(frdRow, "", new byte[] { }, 0); var ng = GisaDataSetHelper.GetInstance().SFRDNotaGeral.AddSFRDNotaGeralRow(frdRow, "", new byte[] { }, 0); var CurrentSFRDAvaliacao = GisaDataSetHelper.GetInstance().SFRDAvaliacao.NewSFRDAvaliacaoRow(); CurrentSFRDAvaliacao.FRDBaseRow = frdRow; CurrentSFRDAvaliacao.IDPertinencia = 1; CurrentSFRDAvaliacao.IDDensidade = 1; CurrentSFRDAvaliacao.IDSubdensidade = 1; CurrentSFRDAvaliacao.Publicar = false; CurrentSFRDAvaliacao.Observacoes = ""; CurrentSFRDAvaliacao.AvaliacaoTabela = false; GisaDataSetHelper.GetInstance().SFRDAvaliacao.AddSFRDAvaliacaoRow(CurrentSFRDAvaliacao); var condA = GisaDataSetHelper.GetInstance().SFRDCondicaoDeAcesso.AddSFRDCondicaoDeAcessoRow(frdRow, "", "", "", "", new byte[] { }, 0); PersistencyHelperRule.Current.saveRows(GisaDataSetHelper.GetInstance().FRDBase, new DataRow[] { frdRow }, postSaveArgs.tran); PersistencyHelperRule.Current.saveRows(GisaDataSetHelper.GetInstance().SFRDDatasProducao, new DataRow[] { dp }, postSaveArgs.tran); PersistencyHelperRule.Current.saveRows(GisaDataSetHelper.GetInstance().SFRDConteudoEEstrutura, new DataRow[] { ce }, postSaveArgs.tran); PersistencyHelperRule.Current.saveRows(GisaDataSetHelper.GetInstance().SFRDContexto, new DataRow[] { c }, postSaveArgs.tran); PersistencyHelperRule.Current.saveRows(GisaDataSetHelper.GetInstance().SFRDDocumentacaoAssociada, new DataRow[] { da }, postSaveArgs.tran); PersistencyHelperRule.Current.saveRows(GisaDataSetHelper.GetInstance().SFRDDimensaoSuporte, new DataRow[] { ds }, postSaveArgs.tran); PersistencyHelperRule.Current.saveRows(GisaDataSetHelper.GetInstance().SFRDNotaGeral, new DataRow[] { ng }, postSaveArgs.tran); PersistencyHelperRule.Current.saveRows(GisaDataSetHelper.GetInstance().SFRDAvaliacao, new DataRow[] { CurrentSFRDAvaliacao }, postSaveArgs.tran); PersistencyHelperRule.Current.saveRows(GisaDataSetHelper.GetInstance().SFRDCondicaoDeAcesso, new DataRow[] { condA }, postSaveArgs.tran); } var nvlRegRow = RecordRegisterHelper .CreateFRDBaseDataDeDescricaoRow(frdRow, caRegRow.TrusteeUserRowByTrusteeUserControloAutDataDeDescricao, caRegRow.TrusteeUserRowByTrusteeUserControloAutDataDeDescricaoAuthority, caRegRow.DataAutoria); nvlRegRow.DataEdicao = caRegRow.DataEdicao; nvlRegRow.IDTipoNivelRelacionado = rhRow.IDTipoNivelRelacionado; GisaDataSetHelper.GetInstance().FRDBaseDataDeDescricao.AddFRDBaseDataDeDescricaoRow(nvlRegRow); PersistencyHelperRule.Current.saveRows(GisaDataSetHelper.GetInstance().FRDBaseDataDeDescricao, GisaDataSetHelper.GetInstance().FRDBaseDataDeDescricao.Cast<GISADataset.FRDBaseDataDeDescricaoRow>().Where(r => r.RowState == DataRowState.Added).ToArray(), postSaveArgs.tran); } } }; PersistencyHelper.save(ValidateCreateRel, pcArgs, postSaveAction); PersistencyHelper.cleanDeletedData(); if (ContextControloAut.RowState == DataRowState.Detached) { MessageBox.Show("Não é possível estabelecer a relação uma vez que a notícia de autoridade " + System.Environment.NewLine + "selecionada no painel superior foi apagada por outro utilizador.", "Erro ao estabelecer relação", MessageBoxButtons.OK, MessageBoxIcon.Warning); return false; } else { if (pcArgs.CreateEditResult == PersistencyHelper.VerifyRelExistencePreConcArguments.CreateEditRelationErrors.RelationAlreadyExists) { MessageBox.Show("Não é permitida mais que uma relação do mesmo tipo entre as mesmas duas entidades produtoras.", "Erro ao estabelecer relação", MessageBoxButtons.OK, MessageBoxIcon.Warning); return false; } else if (pcArgs.CreateEditResult == PersistencyHelper.VerifyRelExistencePreConcArguments.CreateEditRelationErrors.CyclicRelation) { MessageBox.Show("Prestes a criar um conjunto de relações cíclicas.", "Erro ao estabelecer relação", MessageBoxButtons.OK, MessageBoxIcon.Warning); return false; } else if (pcArgs.CreateEditResult == PersistencyHelper.VerifyRelExistencePreConcArguments.CreateEditRelationErrors.CADeleted) { MessageBox.Show("Não é possível estabelecer a relação uma vez que uma das notícias de autoridade " + System.Environment.NewLine + "foi apagada por outro utilizador.", "Erro ao estabelecer relação", MessageBoxButtons.OK, MessageBoxIcon.Warning); return false; } else { GISA.Search.Updater.updateProdutor(new List<string>() { cadRow.ControloAutRow.ID.ToString(), ContextControloAut.ID.ToString()}); GISA.Search.Updater.updateNivelDocumentalComProdutores(cadRow.ControloAutRow.GetNivelControloAutRows()[0].ID); } } } else { GISADataset.ControloAutRelRow carRow = null; carRow = GisaDataSetHelper.GetInstance().ControloAutRel.NewControloAutRelRow(); carRow.IDControloAut = cadRow.ControloAutRow.ID; carRow.IDControloAutAlias = ContextControloAut.ID; carRow.IDTipoRel = tcarRow.ID; // Guardar datas carRow.InicioAno = GISA.Utils.GUIHelper.ReadYear(relacaoCA.dtRelacaoInicio.ValueYear); carRow.InicioMes = GISA.Utils.GUIHelper.ReadMonth(relacaoCA.dtRelacaoInicio.ValueMonth); carRow.InicioDia = GISA.Utils.GUIHelper.ReadDay(relacaoCA.dtRelacaoInicio.ValueDay); carRow.FimAno = GISA.Utils.GUIHelper.ReadYear(relacaoCA.dtRelacaoFim.ValueYear); carRow.FimMes = GISA.Utils.GUIHelper.ReadMonth(relacaoCA.dtRelacaoFim.ValueMonth); carRow.FimDia = GISA.Utils.GUIHelper.ReadDay(relacaoCA.dtRelacaoFim.ValueDay); carRow.Descricao = relacaoCA.txtDescricao.Text; GisaDataSetHelper.GetInstance().ControloAutRel.AddControloAutRelRow(carRow); pcArgs.ID = carRow.IDControloAut; pcArgs.IDUpper = carRow.IDControloAutAlias; pcArgs.IDTipoRel = carRow.IDTipoRel; pcArgs.isCARRow = true; var postSaveAction = new PostSaveAction(); PersistencyHelper.UpdatePermissionsPostSaveArguments args = new PersistencyHelper.UpdatePermissionsPostSaveArguments(); postSaveAction.args = args; postSaveAction.postSaveDelegate = delegate(PersistencyHelper.PostSaveArguments postSaveArgs) { if (!postSaveArgs.cancelAction && ContextControloAut.RowState != DataRowState.Detached && pcArgs.CreateEditResult == PersistencyHelper.VerifyRelExistencePreConcArguments.CreateEditRelationErrors.NoError) { if (this.parent.GetType() == typeof(MasterPanelControloAut)) { ((MasterPanelControloAut)this.parent).CurrentContext.RaiseRegisterModificationEvent(this.ContextControloAut); PersistencyHelperRule.Current.saveRows(GisaDataSetHelper.GetInstance().ControloAutDataDeDescricao, GisaDataSetHelper.GetInstance().ControloAutDataDeDescricao.Cast<GISADataset.ControloAutDataDeDescricaoRow>().Where(r => r.RowState == DataRowState.Added).ToArray(), postSaveArgs.tran); } } }; PersistencyHelper.save(ValidateCreateRel, pcArgs, postSaveAction); PersistencyHelper.cleanDeletedData(); if (ContextControloAut.RowState == DataRowState.Detached) { MessageBox.Show("Não é possível estabelecer a relação uma vez que a notícia de autoridade " + System.Environment.NewLine + "selecionada no painel superior foi apagada por outro utilizador.", "Erro ao estabelecer relação", MessageBoxButtons.OK, MessageBoxIcon.Warning); return false; } else { if (pcArgs.CreateEditResult == PersistencyHelper.VerifyRelExistencePreConcArguments.CreateEditRelationErrors.RelationAlreadyExists) { MessageBox.Show("Não é permitida mais que uma relação do mesmo tipo entre as mesmas duas entidades produtoras.", "Erro ao estabelecer relação", MessageBoxButtons.OK, MessageBoxIcon.Warning); return false; } else { GISA.Search.Updater.updateProdutor(new List<string>() { carRow.IDControloAut.ToString(), carRow.IDControloAutAlias.ToString() }); } } } } else // edição { //Agir de forma diferente conforme seja uma relação hierarquica ou seja uma relação de outro qualquer tipo if (tcarRow.ID == Convert.ToInt64(TipoControloAutRel.Hierarquica)) { long tnrID = 0; tnrID = ((TipoNivelRelacionado.PossibleSubNivel)relacaoCA.cbTipoNivel.SelectedItem).SubIDTipoNivelRelacionado; GISADataset.RelacaoHierarquicaRow rhRow = null; rhRow = (GISADataset.RelacaoHierarquicaRow)ContextRel; // Guardar tipo de nivel rhRow.IDTipoNivelRelacionado = tnrID; // Guardar datas rhRow.InicioAno = GISA.Utils.GUIHelper.ReadYear(relacaoCA.dtRelacaoInicio.ValueYear); rhRow.InicioMes = GISA.Utils.GUIHelper.ReadMonth(relacaoCA.dtRelacaoInicio.ValueMonth); rhRow.InicioDia = GISA.Utils.GUIHelper.ReadDay(relacaoCA.dtRelacaoInicio.ValueDay); rhRow.FimAno = GISA.Utils.GUIHelper.ReadYear(relacaoCA.dtRelacaoFim.ValueYear); rhRow.FimMes = GISA.Utils.GUIHelper.ReadMonth(relacaoCA.dtRelacaoFim.ValueMonth); rhRow.FimDia = GISA.Utils.GUIHelper.ReadDay(relacaoCA.dtRelacaoFim.ValueDay); // Guardar descrição rhRow.Descricao = relacaoCA.txtDescricao.Text; var postSaveAction = new PostSaveAction(); PersistencyHelper.UpdatePermissionsPostSaveArguments args = new PersistencyHelper.UpdatePermissionsPostSaveArguments(); postSaveAction.args = args; postSaveAction.postSaveDelegate = delegate(PersistencyHelper.PostSaveArguments postSaveArgs) { if (!postSaveArgs.cancelAction && ContextControloAut.RowState != DataRowState.Detached && pcArgs.CreateEditResult == PersistencyHelper.VerifyRelExistencePreConcArguments.CreateEditRelationErrors.NoError) { if (this.parent.GetType() == typeof(MasterPanelControloAut)) { ((MasterPanelControloAut)this.parent).CurrentContext.RaiseRegisterModificationEvent(this.ContextControloAut); PersistencyHelperRule.Current.saveRows(GisaDataSetHelper.GetInstance().ControloAutDataDeDescricao, GisaDataSetHelper.GetInstance().ControloAutDataDeDescricao.Cast<GISADataset.ControloAutDataDeDescricaoRow>().Where(r => r.RowState == DataRowState.Added).ToArray(), postSaveArgs.tran); } } }; PersistencyHelper.SaveResult successfulSave = PersistencyHelper.save(postSaveAction); PersistencyHelper.cleanDeletedData(); if (successfulSave == PersistencyHelper.SaveResult.successful) UpdateCA(rhRow); } else { GISADataset.ControloAutRelRow carRow = null; carRow = (GISADataset.ControloAutRelRow)ContextRel; // Actualização de uma relação previamente existente carRow["IDTipoRel"] = ((GISADataset.TipoControloAutRelRow)relacaoCA.cbTipoControloAutRel.SelectedItem).ID; // guardar datas carRow.InicioAno = GISA.Utils.GUIHelper.ReadYear(relacaoCA.dtRelacaoInicio.ValueYear); carRow.InicioMes = GISA.Utils.GUIHelper.ReadMonth(relacaoCA.dtRelacaoInicio.ValueMonth); carRow.InicioDia = GISA.Utils.GUIHelper.ReadDay(relacaoCA.dtRelacaoInicio.ValueDay); carRow.FimAno = GISA.Utils.GUIHelper.ReadYear(relacaoCA.dtRelacaoFim.ValueYear); carRow.FimMes = GISA.Utils.GUIHelper.ReadMonth(relacaoCA.dtRelacaoFim.ValueMonth); carRow.FimDia = GISA.Utils.GUIHelper.ReadDay(relacaoCA.dtRelacaoFim.ValueDay); carRow.Descricao = relacaoCA.txtDescricao.Text; var postSaveAction = new PostSaveAction(); PersistencyHelper.UpdatePermissionsPostSaveArguments args = new PersistencyHelper.UpdatePermissionsPostSaveArguments(); postSaveAction.args = args; postSaveAction.postSaveDelegate = delegate(PersistencyHelper.PostSaveArguments postSaveArgs) { if (!postSaveArgs.cancelAction && ContextControloAut.RowState != DataRowState.Detached && pcArgs.CreateEditResult == PersistencyHelper.VerifyRelExistencePreConcArguments.CreateEditRelationErrors.NoError) { if (this.parent.GetType() == typeof(MasterPanelControloAut)) { ((MasterPanelControloAut)this.parent).CurrentContext.RaiseRegisterModificationEvent(this.ContextControloAut); PersistencyHelperRule.Current.saveRows(GisaDataSetHelper.GetInstance().ControloAutDataDeDescricao, GisaDataSetHelper.GetInstance().ControloAutDataDeDescricao.Cast<GISADataset.ControloAutDataDeDescricaoRow>().Where(r => r.RowState == DataRowState.Added).ToArray(), postSaveArgs.tran); } } }; PersistencyHelper.SaveResult successfulSave = PersistencyHelper.save(postSaveAction); PersistencyHelper.cleanDeletedData(); if (successfulSave == PersistencyHelper.SaveResult.successful) UpdateCA(carRow); } } //TODO: PARA ALGUMAS DAS SEGUINTES VALIDACOES SERÁ NECESSÁRIO TRAZER PARA DENTRO DESTE FORM UMA GRANDE PARTE DA LOGICA EXISTENTE FORA DELE, NOMEADAMENTE A NOÇÃO DE SE ESTE FORM ESTÁ A SER UTILIZADO NA CRIAÇÃO OU NA EDIÇÃO DE UMA DADA RELAÇÃO //ToDo: validar que as datas da relação não vão para alem das datas de existencia de ambos os níveis (superior e inferior) //ToDo: validar que o tipo de nivel escolhido está de acordo com os tipos de nivel subordinados return true; }
protected override void AcceptContents(object Value) { GISADataset.ControloAutRow ControloAutRow = (GISADataset.ControloAutRow)Value; if (FRDBase != null) { // Carregar nivel do CA largado IDbConnection conn = GisaDataSetHelper.GetConnection(); try { conn.Open(); DBAbstractDataLayer.DataAccessRules.NivelRule.Current.LoadNivelByControloAut(ControloAutRow.ID, GisaDataSetHelper.GetInstance(), conn); } finally { conn.Close(); } if (IsValidRelacaoHierarquica(ControloAutRow)) { // Apresentar form que permita escolher a data da relação FormRelacaoHierarquica frmRh = new FormRelacaoHierarquica(); // Pode-se obter a primeira relação encontrada para efeitos de determinação // do tipo de nível uma vez que o tipo de nível dos níveis documentais nunca se alterará frmRh.relacaoNvl.TipoNivelRelacionadoRow = TipoNivelRelacionado.GetPrimeiraRelacaoEncontrada(this.FRDBase.NivelRow).TipoNivelRelacionadoRow; frmRh.relacaoNvl.ContextNivelRow = ControloAutRow.GetNivelControloAutRows()[0].NivelRow; if (frmRh.ShowDialog() == DialogResult.Cancel) { return; } if (GisaDataSetHelper.GetInstance().RelacaoHierarquica.Select(string.Format("ID={0} AND IDUpper={1}", this.FRDBase.NivelRow.ID, ControloAutRow.GetNivelControloAutRows()[0].NivelRow.ID), "", DataViewRowState.Deleted).Length > 0) { GisaDataSetHelper.GetInstance().RelacaoHierarquica.Select(string.Format("ID={0} AND IDUpper={1}", this.FRDBase.NivelRow.ID, ControloAutRow.GetNivelControloAutRows()[0].NivelRow.ID), "", DataViewRowState.Deleted)[0].AcceptChanges(); } GISADataset.RelacaoHierarquicaRow rhRow = null; rhRow = GisaDataSetHelper.GetInstance().RelacaoHierarquica.NewRelacaoHierarquicaRow(); TempRelacaoHierarquica = rhRow; rhRow.ID = this.FRDBase.NivelRow.ID; rhRow.IDUpper = ControloAutRow.GetNivelControloAutRows()[0].NivelRow.ID; rhRow.IDTipoNivelRelacionado = TipoNivelRelacionado.GetTipoNivelRelacionadoDaPrimeiraRelacaoEncontrada(this.FRDBase.NivelRow).ID; rhRow.Descricao = frmRh.relacaoNvl.txtDescricao.Text; rhRow.InicioAno = frmRh.relacaoNvl.dtRelacaoInicio.ValueYear; rhRow.InicioMes = frmRh.relacaoNvl.dtRelacaoInicio.ValueMonth; rhRow.InicioDia = frmRh.relacaoNvl.dtRelacaoInicio.ValueDay; rhRow.FimAno = frmRh.relacaoNvl.dtRelacaoFim.ValueYear; rhRow.FimMes = frmRh.relacaoNvl.dtRelacaoFim.ValueMonth; rhRow.FimDia = frmRh.relacaoNvl.dtRelacaoFim.ValueDay; GisaDataSetHelper.GetInstance().RelacaoHierarquica.AddRelacaoHierarquicaRow(rhRow); // no caso de se tratar de uma entidade produtora é necessário validar o código de referência do nivel documental do contexto if (ControloAutRow.IDTipoNoticiaAut == (long)TipoNoticiaAut.EntidadeProdutora) { var argsPC = new PersistencyHelper.EnsureUniqueCodigoNivelPreConcArguments(); argsPC.rhRowID = rhRow.ID; argsPC.rhRowIDUpper = rhRow.IDUpper; var postSaveAction = new PostSaveAction(); PersistencyHelper.UpdatePermissionsPostSaveArguments args = new PersistencyHelper.UpdatePermissionsPostSaveArguments(); postSaveAction.args = args; postSaveAction.postSaveDelegate = delegate(PersistencyHelper.PostSaveArguments postSaveArgs) { if (argsPC.successful) { if (this.parent == null) Debug.Assert(false, "CONTEXTO PARENT DEVE ESTAR DEFINIDO."); if (this.parent.GetType() == typeof(MasterPanelSeries)) { ((MasterPanelSeries)this.parent).CurrentContext.RaiseRegisterModificationEvent(this.FRDBase); PersistencyHelperRule.Current.saveRows(GisaDataSetHelper.GetInstance().FRDBaseDataDeDescricao, GisaDataSetHelper.GetInstance().FRDBaseDataDeDescricao.Cast<GISADataset.FRDBaseDataDeDescricaoRow>().Where(r => r.RowState == DataRowState.Added).ToArray(), postSaveArgs.tran); } } }; var result = PersistencyHelper.save(DelegatesHelper.verificaCodigosRepetidos, argsPC, postSaveAction, true); if (result == PersistencyHelper.SaveResult.successful) { PersistencyHelper.cleanDeletedData(); GisaDataSetHelper.VisitControloAutDicionario(ControloAutRow, DisplayFormaAutorizada); GISA.Search.Updater.updateNivelDocumental(this.FRDBase.NivelRow.ID); } else { if (argsPC.message.Length > 0) MessageBox.Show(argsPC.message, "Adição", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } } else { MessageBox.Show("Não é possível a existência de items repetidos.", "Adição", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } else if (this.ControloAut != null) { Debug.Assert(false, "ORGANIC RELATIONS BETWEEN CAS NOT IMPLEMENTED. SHOULDN'T BE NEEDED"); } }
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; }
private void ClickBtnCriar() { ((frmMain)TopLevelControl).EnterWaitMode(); if (((frmMain)TopLevelControl).isSuportPanel && !PersistencyHelper.hasCurrentDatasetChanges()) { if (GetCurrentTipoNoticiaAut()[0] == TipoNoticiaAut.EntidadeProdutora) { MessageBox.Show("Não é permitido criar entidades produtores a partir de um painel de suporte." + System.Environment.NewLine + "Selecione a área de menu referente às entidades produtoras para efetuar a operação", "Criação de entidade produtora", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } try { Trace.WriteLine("Saving before creating new CA in suport panel..."); PersistencyHelper.save(); PersistencyHelper.cleanDeletedData(); } catch (Exception) { MessageBox.Show("Ocorreu um erro ao tentar abrir o formulário de criação." + System.Environment.NewLine + "Por favor contacte o administrador de sistema.", "Criação de controlo de autoridade", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } FormCreateControloAut form = null; try { if (GetCurrentTipoNoticiaAut()[0] == TipoNoticiaAut.EntidadeProdutora) form = new FormCreateEntidadeProdutora(); else form = new FormCreateControloAut(); form.cbNoticiaAut.BeginUpdate(); form.cbNoticiaAut.DataSource = caList.cbNoticiaAut.DataSource; form.cbNoticiaAut.DisplayMember = caList.cbNoticiaAut.DisplayMember; form.cbNoticiaAut.EndUpdate(); if (form.cbNoticiaAut.Items.Count == 2) { form.cbNoticiaAut.SelectedIndex = 1; form.cbNoticiaAut.Enabled = false; } form.LoadData(true); } finally { ((frmMain)TopLevelControl).LeaveWaitMode(); } switch (form.ShowDialog()) { case DialogResult.OK: Trace.WriteLine("A criar notícia de autoridade..."); GISADataset.DicionarioRow dicionarioRow = null; if (GisaDataSetHelper.GetInstance().Dicionario.Select(string.Format("Termo = '{0}'", form.ListTermos.ValidAuthorizedForm.Replace("'", "''"))).Length > 0 && form.ListTermos.ValidAuthorizedForm != null) dicionarioRow = (GISADataset.DicionarioRow)(GisaDataSetHelper.GetInstance().Dicionario.Select(string.Format("Termo = '{0}'", form.ListTermos.ValidAuthorizedForm.Replace("'", "''")))[0]); else if (form.ListTermos.ValidAuthorizedForm != null && form.ListTermos.ValidAuthorizedForm.Length > 0) { dicionarioRow = GisaDataSetHelper.GetInstance().Dicionario.NewDicionarioRow(); dicionarioRow.Termo = form.ListTermos.ValidAuthorizedForm; dicionarioRow.CatCode = "CA"; dicionarioRow.Versao = new byte[]{}; } // excluir selecção de termos inválidos. nunca deveria acontecer Trace.Assert(dicionarioRow != null); // se o estado da row for detached trata-se de um novo termo // criado. nesse caso é necessário adiciona-lo ao dataset. if (dicionarioRow.RowState == DataRowState.Detached) { dicionarioRow.isDeleted = 0; GisaDataSetHelper.GetInstance().Dicionario.AddDicionarioRow(dicionarioRow); } // obter o tipo de noticia de autoridade escolhido GISADataset.TipoNoticiaAutRow tnaRow = null; tnaRow = (GISADataset.TipoNoticiaAutRow)form.cbNoticiaAut.SelectedItem; Trace.Assert(tnaRow != null); // adicionar a nova notícia de autoridade ao modelo de dados e à interface GISADataset.ControloAutRow caRow = GisaDataSetHelper.GetInstance().ControloAut.NewControloAutRow(); caRow.Autorizado = false; caRow.Completo = false; caRow.IDTipoNoticiaAut = tnaRow.ID; caRow.NotaExplicativa = ""; caRow.IDIso639p2 = 348L; // language: portuguese caRow.IDIso15924 = 60L; // script: latin caRow.ChaveColectividade = ""; caRow.ChaveRegisto = ""; caRow.RegrasConvencoes = ""; caRow.Observacoes = ""; caRow.DescContextoGeral = ""; caRow.DescEnquadramentoLegal = ""; caRow.DescEstatutoLegal = ""; caRow.DescEstruturaInterna = ""; caRow.DescOcupacoesActividades = ""; caRow.DescHistoria = ""; caRow.DescOutraInformacaoRelevante = ""; caRow.DescZonaGeografica = ""; caRow.isDeleted = 0; GisaDataSetHelper.GetInstance().ControloAut.AddControloAutRow(caRow); GISADataset.TipoControloAutFormaRow tcafRowAutorizado = null; tcafRowAutorizado = (GISADataset.TipoControloAutFormaRow)(GisaDataSetHelper.GetInstance().TipoControloAutForma.Select("ID=" + System.Enum.Format(typeof(TipoControloAutForma), TipoControloAutForma.FormaAutorizada, "D"))[0]); // criar um registo em ControloAutDicionario usando o termo obtido e com TipoControloAutforma "autorizado" byte[] Versao = null; GISADataset.ControloAutDicionarioRow cadRow = null; cadRow = GisaDataSetHelper.GetInstance().ControloAutDicionario.AddControloAutDicionarioRow(caRow, dicionarioRow, tcafRowAutorizado, Versao, 0); //Ao criar uma EP criar também um nível correspondente, de forma a ser possível adicionar "RelacaoHierarquica"s GISADataset.NivelRow nRow = null; GISADataset.NivelControloAutRow ncaRow = null; var args = new PersistencyHelper.NewControloAutPreSaveArguments(); var postSaveAction = new PostSaveAction(); var argsPostSave = new PersistencyHelper.UpdatePermissionsPostSaveArguments(); postSaveAction.args = argsPostSave; postSaveAction.postSaveDelegate = delegate(PersistencyHelper.PostSaveArguments postSaveArgs) { if ((tnaRow.ID == (long)TipoNoticiaAut.EntidadeProdutora && !args.successCodigo) || !args.successTermo) return; // registar a criação do controlo de autoridade (o registo deve ser feito à parte do save visto que a tabela ControloAutDataDeExistencia não está ligada a ControloAut e por esse motivo, o ID na tabela de registo ser igual em ControloAut em vez de ser negativo) if (((frmMain)TopLevelControl).isSuportPanel) { GISADataset.TrusteeUserRow tuAuthorRow = null; if (SessionHelper.GetGisaPrincipal().TrusteeUserAuthor != null && !(SessionHelper.GetGisaPrincipal().TrusteeUserAuthor.RowState == DataRowState.Detached)) tuAuthorRow = SessionHelper.GetGisaPrincipal().TrusteeUserAuthor; var r = GISA.Model.RecordRegisterHelper.CreateControlAutDataDeDescricaoRow(caRow, SessionHelper.GetGisaPrincipal().TrusteeUserOperator, tuAuthorRow, DateTime.Now); GisaDataSetHelper.GetInstance().ControloAutDataDeDescricao.AddControloAutDataDeDescricaoRow(r); } else CurrentContext.RaiseRegisterModificationEvent(caRow); PersistencyHelperRule.Current.saveRows(GisaDataSetHelper.GetInstance().ControloAutDataDeDescricao, GisaDataSetHelper.GetInstance().ControloAutDataDeDescricao.Cast<GISADataset.ControloAutDataDeDescricaoRow>().Where(ca => ca.RowState == DataRowState.Added).ToArray(), postSaveArgs.tran); }; if (caRow.TipoNoticiaAutRow.ID == Convert.ToInt64(TipoNoticiaAut.EntidadeProdutora)) { var tep = GisaDataSetHelper.GetInstance().TipoEntidadeProdutora.Cast<GISADataset.TipoEntidadeProdutoraRow>().First(); GisaDataSetHelper.GetInstance().ControloAutEntidadeProdutora.AddControloAutEntidadeProdutoraRow(caRow, tep, new byte[] { }, 0); GisaDataSetHelper.GetInstance().ControloAutDatasExistencia.AddControloAutDatasExistenciaRow(caRow, "", "", "", "", false, "", "", "", false, new byte[] { }, 0); CreateAssociatedNivel(caRow, ref nRow, ref ncaRow); nRow.Codigo = ((FormCreateEntidadeProdutora)form).txtCodigo.Text; args.nID = nRow.ID; } try { args.caID = caRow.ID; args.dID = dicionarioRow.ID; args.dTermo = dicionarioRow.Termo.Replace("'", "''"); args.cadIDControloAut = cadRow.IDControloAut; args.cadIDDicionario = cadRow.IDDicionario; args.cadIDTipoControloAutForma = cadRow.IDTipoControloAutForma; PersistencyHelper.SaveResult successfulSave = PersistencyHelper.save(DelegatesHelper.validateCANewTermo, args, postSaveAction); PersistencyHelper.cleanDeletedData(new List<TableDepthOrdered.TableCloudType>(new TableDepthOrdered.TableCloudType[] { PersistencyHelper.determinaNuvem("Nivel"), PersistencyHelper.determinaNuvem("ControloAut") })); if (args.successTermo && (!(form is FormCreateEntidadeProdutora) || args.successCodigo)) { if (successfulSave == PersistencyHelper.SaveResult.successful) { GisaDataSetHelper.HoldOpen ho = new GisaDataSetHelper.HoldOpen(GisaDataSetHelper.GetConnection()); try { List<string> IDNiveis = ControloAutRule.Current.GetNiveisDocAssociados(caRow.ID, ho.Connection); GISA.Search.Updater.updateNivelDocumental(IDNiveis); } catch (Exception ex) { Trace.WriteLine(ex.ToString()); throw; } finally { ho.Dispose(); } } caList.AddNivel(cadRow); } else { if (form is FormCreateEntidadeProdutora) MessageBox.Show("Não foi possível criar a notícia de autoridade " + Environment.NewLine + "uma vez que essa designação e/ou código já" + Environment.NewLine + "é utilizada.", "Nova Notícia de autoridade", MessageBoxButtons.OK, MessageBoxIcon.Warning); else MessageBox.Show("Não foi possível criar a notícia de autoridade " + Environment.NewLine + "uma vez que já existe uma com essa designação.", "Nova Notícia de autoridade", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } catch (Exception ex) { Trace.WriteLine(ex); throw; } break; case DialogResult.Cancel: break; } }
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."); } }
// 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; }
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(); } }
private void DeleteRelacao(ListView lstVw) { var IDNivel = new List<string>(); var IDControloAut = new List<string>(); var frdRow = default(GISADataset.FRDBaseRow); long IDTipoNivelRelacionado = -1; foreach (ListViewItem item in lstVw.SelectedItems) { if (item.Tag.GetType() == typeof(GISADataset.ControloAutRelRow)) { var carRow = (GISADataset.ControloAutRelRow)item.Tag; IDControloAut.Add(carRow.IDControloAut.ToString()); IDControloAut.Add(carRow.IDControloAutAlias.ToString()); } else { var rhRow = (GISADataset.RelacaoHierarquicaRow)item.Tag; IDControloAut.Add(rhRow.NivelRowByNivelRelacaoHierarquica.GetNivelControloAutRows()[0].IDControloAut.ToString()); IDControloAut.Add(rhRow.NivelRowByNivelRelacaoHierarquicaUpper.GetNivelControloAutRows()[0].IDControloAut.ToString()); IDNivel.Add(rhRow.ID.ToString()); frdRow = rhRow.NivelRowByNivelRelacaoHierarquica.GetFRDBaseRows().Single(); IDTipoNivelRelacionado = rhRow.IDTipoNivelRelacionado; } } GUIHelper.GUIHelper.deleteSelectedLstVwItems(lstVw); var postSaveAction = new PostSaveAction(); PersistencyHelper.UpdatePermissionsPostSaveArguments args = new PersistencyHelper.UpdatePermissionsPostSaveArguments(); postSaveAction.args = args; postSaveAction.postSaveDelegate = delegate(PersistencyHelper.PostSaveArguments postSaveArgs) { if (!postSaveArgs.cancelAction) { // registar eliminação ((frmMain)TopLevelControl).CurrentContext.RaiseRegisterModificationEvent(CurrentControloAut); var caRegRow = GisaDataSetHelper.GetInstance().ControloAutDataDeDescricao.Cast<GISADataset.ControloAutDataDeDescricaoRow>().Single(r => r.RowState == DataRowState.Added); PersistencyHelperRule.Current.saveRows(GisaDataSetHelper.GetInstance().ControloAutDataDeDescricao, GisaDataSetHelper.GetInstance().ControloAutDataDeDescricao.Cast<GISADataset.ControloAutDataDeDescricaoRow>().Where(r => r.RowState == DataRowState.Added).ToArray(), postSaveArgs.tran); if (frdRow != null) { var nvlRegRow = RecordRegisterHelper .CreateFRDBaseDataDeDescricaoRow(frdRow, caRegRow.TrusteeUserRowByTrusteeUserControloAutDataDeDescricao, caRegRow.TrusteeUserRowByTrusteeUserControloAutDataDeDescricaoAuthority, caRegRow.DataAutoria); nvlRegRow.DataEdicao = caRegRow.DataEdicao; nvlRegRow.IDTipoNivelRelacionado = IDTipoNivelRelacionado; GisaDataSetHelper.GetInstance().FRDBaseDataDeDescricao.AddFRDBaseDataDeDescricaoRow(nvlRegRow); PersistencyHelperRule.Current.saveRows(GisaDataSetHelper.GetInstance().FRDBaseDataDeDescricao, GisaDataSetHelper.GetInstance().FRDBaseDataDeDescricao.Cast<GISADataset.FRDBaseDataDeDescricaoRow>().Where(r => r.RowState == DataRowState.Added).ToArray(), postSaveArgs.tran); } } }; var successfulSave = PersistencyHelper.save(postSaveAction); PersistencyHelper.cleanDeletedData(); if (successfulSave == PersistencyHelper.SaveResult.successful) { GISA.Search.Updater.updateProdutor(IDControloAut); GISA.Search.Updater.updateNivelDocumentalComProdutores(IDNivel); } }
public override PersistencyHelper.SaveResult Save(bool activateOpcaoCancelar) { if (this.CurrentFRDBase == null) return PersistencyHelper.SaveResult.unsuccessful; List<long> IDs = new List<long>(); List<string> idsToUpdate = new List<string>(); List<NivelRule.PublicacaoDocumentos> DocsID = new List<NivelRule.PublicacaoDocumentos> (); GISADataset.RelacaoHierarquicaRow rhRow = null; PersistencyHelper.SaveResult successfulSave = PersistencyHelper.SaveResult.unsuccessful; if ((CurrentFRDBase.NivelRow.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica().Length > 0)) { rhRow = CurrentFRDBase.NivelRow.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica()[0]; PersistencyHelper.PublishSubDocumentosPreSaveArguments psArgs1 = new PersistencyHelper.PublishSubDocumentosPreSaveArguments(); PersistencyHelper.AvaliaDocumentosTabelaPreSaveArguments psArgs2 = new PersistencyHelper.AvaliaDocumentosTabelaPreSaveArguments(); // publicação de subdocumentos baseado na publicação dos documentos respectivos if (rhRow.IDTipoNivelRelacionado == TipoNivelRelacionado.D) { //contexto é um documento if (CurrentFRDBase.GetSFRDAvaliacaoRows().Length > 0) { GISADataset.SFRDAvaliacaoRow relRow = CurrentFRDBase.GetSFRDAvaliacaoRows()[0]; if ((relRow.RowState == DataRowState.Added && relRow.Publicar) || relRow.RowState == DataRowState.Modified) { DocsID.Add(new DBAbstractDataLayer.DataAccessRules.NivelRule.PublicacaoDocumentos(CurrentFRDBase.NivelRow.ID, CurrentFRDBase.GetSFRDAvaliacaoRows()[0].Publicar)); IDs.Add(CurrentFRDBase.NivelRow.ID); PermissoesHelper.ChangeDocPermissionPublicados(CurrentFRDBase.NivelRow.ID, (CurrentFRDBase.GetSFRDAvaliacaoRows())[0].Publicar); } } } else if (rhRow.IDTipoNivelRelacionado == TipoNivelRelacionado.SR || rhRow.IDTipoNivelRelacionado == TipoNivelRelacionado.SSR) { //o contexto é uma série ou subsérie e é alterado o estado de publicação de vários documentos simultaneamente foreach (GISADataset.SFRDAvaliacaoRow sfrdAv in GisaDataSetHelper.GetInstance().SFRDAvaliacao.Select("", "", DataViewRowState.Added | DataViewRowState.ModifiedCurrent)) { if (sfrdAv.FRDBaseRow.ID != CurrentFRDBase.ID) { DocsID.Add(new DBAbstractDataLayer.DataAccessRules.NivelRule.PublicacaoDocumentos(sfrdAv.FRDBaseRow.NivelRow.ID, sfrdAv.Publicar)); IDs.Add(sfrdAv.FRDBaseRow.NivelRow.ID); PermissoesHelper.ChangeDocPermissionPublicados(sfrdAv.FRDBaseRow.NivelRow.ID, sfrdAv.Publicar); } else IDs.Add(sfrdAv.FRDBaseRow.IDNivel); } if (!(CurrentFRDBase.GetSFRDAvaliacaoRows().Length == 0 || CurrentFRDBase.GetSFRDAvaliacaoRows()[0].IsIDModeloAvaliacaoNull() || (!(CurrentFRDBase.GetSFRDAvaliacaoRows()[0].RowState == DataRowState.Added) && !(CurrentFRDBase.GetSFRDAvaliacaoRows()[0]["IDModeloAvaliacao", DataRowVersion.Original] == DBNull.Value) && ((long)(CurrentFRDBase.GetSFRDAvaliacaoRows()[0]["IDModeloAvaliacao", DataRowVersion.Original])) == (long)(CurrentFRDBase.GetSFRDAvaliacaoRows()[0]["IDModeloAvaliacao", DataRowVersion.Current])))) { psArgs2.frdID = CurrentFRDBase.ID; psArgs2.modeloAvaliacaoID = CurrentFRDBase.GetSFRDAvaliacaoRows()[0].IDModeloAvaliacao; psArgs2.avaliacaoTabela = CurrentFRDBase.GetSFRDAvaliacaoRows()[0].AvaliacaoTabela; if (CurrentFRDBase.GetSFRDAvaliacaoRows()[0].IsPrazoConservacaoNull()) psArgs2.prazoConservacao = 0; else psArgs2.prazoConservacao = CurrentFRDBase.GetSFRDAvaliacaoRows()[0].PrazoConservacao; psArgs2.preservar = CurrentFRDBase.GetSFRDAvaliacaoRows()[0].Preservar; } } else { foreach (GISADataset.SFRDAvaliacaoRow sfrdAv in GisaDataSetHelper.GetInstance().SFRDAvaliacao.Select("", "", DataViewRowState.Added | DataViewRowState.ModifiedCurrent)) { PermissoesHelper.ChangeDocPermissionPublicados(sfrdAv.FRDBaseRow.NivelRow.ID, sfrdAv.Publicar); IDs.Add(sfrdAv.FRDBaseRow.IDNivel); } } // actualização do objecto digital caso exista ou o módulo esteja activo rhRow = CurrentFRDBase.NivelRow.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica().First(); var objDigital = default(ObjDigital); if (rhRow.IDTipoNivelRelacionado >= (long)TipoNivelRelacionado.D && SessionHelper.AppConfiguration.GetCurrentAppconfiguration().IsFedoraEnable()) { GisaDataSetHelper.HoldOpen ho = new GisaDataSetHelper.HoldOpen(GisaDataSetHelper.GetConnection()); try { GisaDataSetHelper.ManageDatasetConstraints(false); if (!PanelAmbitoConteudo1.IsLoaded) PanelAmbitoConteudo1.LoadData(CurrentFRDBase, ho.Connection); if (!PanelIndexacao1.IsLoaded) PanelIndexacao1.LoadData(CurrentFRDBase, ho.Connection); GisaDataSetHelper.ManageDatasetConstraints(true); } catch (System.Data.ConstraintException Ex) { Trace.WriteLine(Ex); GisaDataSetHelper.FixDataSet(GisaDataSetHelper.GetInstance(), ho.Connection); } catch (Exception e) { Trace.WriteLine(e); throw; } finally { ho.Dispose(); } // verificar alterações na tipologia e indexação var tipologia = string.Empty; var hasNewTip = Nivel.HasTipologiaChanged(CurrentFRDBase, out tipologia); var assuntos = Nivel.HasIndexacaoChanged(CurrentFRDBase); if (hasNewTip || assuntos != null) { objDigital = FedoraHelper.UpdateTipAssuntos(CurrentFRDBase.NivelRow, hasNewTip ? tipologia : null, assuntos); } } // actualizar objecto digital caso exista var preTransactionAction = new PreTransactionAction(); var fedArgs = new PersistencyHelper.FedoraIngestPreTransactionArguments(); preTransactionAction.args = fedArgs; preTransactionAction.preTransactionDelegate = delegate(PersistencyHelper.PreTransactionArguments preTransactionArgs) { var odComp = this.PanelObjetoDigitalFedora1.GetObjDigitalComp(); var odSimples = this.PanelObjetoDigitalFedora1.GetObjDigitalSimples(); bool ingestSuccess = true; string msg = null; if (odComp != null) ingestSuccess = SessionHelper.AppConfiguration.GetCurrentAppconfiguration().FedoraHelperSingleton.Ingest(odComp, out msg); else if (odSimples != null && odSimples.Count > 0) odSimples.ForEach(od => ingestSuccess &= SessionHelper.AppConfiguration.GetCurrentAppconfiguration().FedoraHelperSingleton.Ingest(od, out msg)); if (ingestSuccess) this.PanelObjetoDigitalFedora1.odHelper.newObjects.Keys.ToList().ForEach(k => { k.pid = this.PanelObjetoDigitalFedora1.odHelper.newObjects[k].pid; }); preTransactionArgs.cancelAction = !ingestSuccess; preTransactionArgs.message = msg; }; psArgs1.DocsID = DocsID; PostSaveAction postSaveAction = new PostSaveAction(); PersistencyHelper.UpdatePermissionsPostSaveArguments argsPSAction = new PersistencyHelper.UpdatePermissionsPostSaveArguments(); argsPSAction.NiveisIDs = IDs; argsPSAction.TrusteeID = PermissoesHelper.GrpAcessoPublicados.ID; postSaveAction.args = argsPSAction; postSaveAction.postSaveDelegate = delegate(PersistencyHelper.PostSaveArguments postSaveArgs) { if (!postSaveArgs.cancelAction && argsPSAction.NiveisIDs.Count > 0) { if (psArgs1 != null) idsToUpdate = psArgs1.idsToUpdate; } }; PersistencyHelper.AvaliacaoPublicacaoPreSaveArguments args = new PersistencyHelper.AvaliacaoPublicacaoPreSaveArguments(); args.psArgs1 = psArgs1; args.psArgs2 = psArgs2; successfulSave = PersistencyHelper.save(AvaliacaoPublicacao, args, postSaveAction, preTransactionAction, activateOpcaoCancelar); } else successfulSave = PersistencyHelper.save(); if (successfulSave == PersistencyHelper.SaveResult.successful) { GisaDataSetHelper.HoldOpen ho = new GisaDataSetHelper.HoldOpen(GisaDataSetHelper.GetConnection()); try { if (CurrentFRDBase.NivelRow.IDTipoNivel == TipoNivel.DOCUMENTAL) { if (idsToUpdate == null) idsToUpdate = new List<string>(); idsToUpdate.Add(CurrentFRDBase.NivelRow.ID.ToString()); GISA.Search.Updater.updateNivelDocumental(idsToUpdate); } ((frmMain)TopLevelControl).SetServerStatus(); } catch (GISA.Search.UpdateServerException) { ((frmMain)TopLevelControl).SetServerStatus(); } catch (Exception ex) { Trace.WriteLine(ex.ToString()); throw; } finally { ho.Dispose(); } } return successfulSave; }