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;
			}
		}
Esempio n. 3
0
		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;
		}
Esempio n. 4
0
		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");
			}
		}
Esempio n. 5
0
        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;
			}
		}
Esempio n. 7
0
        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.");
            }
        }
Esempio n. 8
0
		// 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;
		}       
Esempio n. 9
0
        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();
            }
        }
Esempio n. 10
0
        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);
            }

            
        }
Esempio n. 11
0
        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;
		}