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");
			}
		}
Example #2
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;
        }
Example #3
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;
		}       
Example #4
0
		private void EditNivel(FormAddNivel frm, GISADataset.NivelRow NivelRow)
		{
            GISADataset.TipoNivelRelacionadoRow tnrRow;
            if (NivelRow.IDTipoNivel == TipoNivel.LOGICO && GisaDataSetHelper.GetInstance().RelacaoHierarquica.Select("ID="+NivelRow.ID.ToString()).Length == 0)
                tnrRow = GisaDataSetHelper.GetInstance().TipoNivelRelacionado.Cast<GISADataset.TipoNivelRelacionadoRow>().Single(r => r.ID == TipoNivelRelacionado.ED);
            else
                tnrRow = GisaDataSetHelper.GetInstance().RelacaoHierarquica.Cast<GISADataset.RelacaoHierarquicaRow>().First(r => r.ID == NivelRow.ID && r.RowState != DataRowState.Deleted).TipoNivelRelacionadoRow;

			string WindowTitle = string.Format("Editar {0}", tnrRow.Designacao);
			// Don't allow to edit a Nivel without a Controlo 
			// Autoridade using a form with Controlo Autoridade.
			// frm will only be of type FormNivelEstrutural if the
			// related administration option is set to "demand a ControloAutoridade"
			if (frm is FormNivelEstrutural && ! (NivelRow.CatCode.Trim().Equals("CA")))
			{
				MessageBox.Show("O nível selecionado não foi definido com " + "base numa entidade produtora." + System.Environment.NewLine + "Assim, para que este nível seja editável é necessário " + "que a aplicação esteja " + System.Environment.NewLine + "configurada para lidar com níveis não controlados.", WindowTitle, MessageBoxButtons.OK, MessageBoxIcon.Information);
				return;
			}
			else if (! (frm is FormNivelEstrutural) && ! (NivelRow.CatCode.Trim().Equals("NVL")))
			{
				MessageBox.Show("O nível selecionado foi definido com " + "base numa entidade produtora." + System.Environment.NewLine + "Assim, para que este nível seja editável é necessário " + "que a aplicação esteja " + System.Environment.NewLine + "configurada para lidar com níveis controlados.", WindowTitle, MessageBoxButtons.OK, MessageBoxIcon.Information);
				return;
			}

			frm.Text = WindowTitle;
			frm.txtCodigo.Text = NivelRow.Codigo;
			frm.txtDesignacao.Text = Nivel.GetDesignacao(NivelRow);
			// se se tratar de uma série ou subsérie o código será sempre automático
			if (tnrRow.ID == TipoNivelRelacionado.SR || tnrRow.ID == TipoNivelRelacionado.SSR)
				frm.txtCodigo.Enabled = false;

			frm.LoadData();

			if (NivelRow.TipoNivelRow.ID != TipoNivel.LOGICO)
			{
				// populate controls with data so that it can be edited

				if (frm is FormNivelEstrutural)
				{
                    FormNivelEstrutural tempWith1 = (FormNivelEstrutural)frm;
					if (NivelRow.CatCode.Trim().Equals("CA"))
					{
						tempWith1.caList.txtFiltroDesignacao.Text = tempWith1.txtDesignacao.Text;
                        tempWith1.caList.ReloadList();
						tempWith1.chkControloAut = true;
					}
					else if (NivelRow.CatCode.Trim().Equals("NVL"))
						tempWith1.chkControloAut = false;
				}
			}

			// show form and receive user feedback
			switch (frm.ShowDialog())
			{
				case DialogResult.OK:
				Trace.WriteLine("A editar nível...");
					GISADataset.NivelDesignadoRow ndRow = null;
					
					// Um Nivel documental deve ter obrigatoriamente um NivelDesignado.
                    Debug.Assert(NivelRow.GetNivelDesignadoRows().Length > 0);
					ndRow = NivelRow.GetNivelDesignadoRows()[0];
                    
                    NivelRow.Codigo = frm.txtCodigo.Text;
                    ndRow.Designacao = frm.txtDesignacao.Text;

                    // registar a edição do item selecionado
                    if (NivelRow.IDTipoNivel != TipoNivel.LOGICO)
                        CurrentContext.RaiseRegisterModificationEvent(NivelRow.GetFRDBaseRows()[0]);

					PersistencyHelper.EnsureUniqueCodigoNivelPreConcArguments pcArgs = new PersistencyHelper.EnsureUniqueCodigoNivelPreConcArguments();
					pcArgs.nRowID = NivelRow.ID;
					pcArgs.ndRowID = ndRow.ID;
					// Se se tratar de uma entidade detentora não passar os Ids de uma relação
					// hierárquica para um nível superior pois não existe nenhum.
					if (NivelRow.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica().Length > 0)
					{
						pcArgs.rhRowID = NivelRow.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica()[0].ID;
						pcArgs.rhRowIDUpper = NivelRow.GetRelacaoHierarquicaRowsByNivelRelacaoHierarquica()[0].IDUpper;
					}
					pcArgs.testOnlyWithinNivel = true;

                    PersistencyHelper.SaveResult successfulSave = PersistencyHelper.save(DelegatesHelper.ensureUniqueCodigo, pcArgs);
					if (! pcArgs.successful)
						MessageBox.Show(pcArgs.message, "Criação de unidade de descrição", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    else if (successfulSave == PersistencyHelper.SaveResult.successful)
                    {
                        GisaDataSetHelper.HoldOpen ho = new GisaDataSetHelper.HoldOpen(GisaDataSetHelper.GetConnection());
                        try
                        {
                            List<string> IDNiveis = new List<string>();
                            IDNiveis.Add(NivelRow.ID.ToString());
                            GISA.Search.Updater.updateNivelDocumental(IDNiveis);
                        }
                        catch (Exception ex)
                        {
                            Trace.WriteLine(ex.ToString());
                            throw;
                        }
                        finally
                        {
                            ho.Dispose();
                        }
                    }

                    PersistencyHelper.cleanDeletedData(PersistencyHelper.determinaNuvem("RelacaoHierarquica"));

					// Actualizar a interface com os novos valores. Se editarmos a 
					// raiz (estrutural) da vista documental é necessário actualizar 
					// automaticamente também a vista estrutural.

					if (! (NivelRow.RowState == DataRowState.Detached))
					{
                        if (this.nivelNavigator1.PanelToggleState == NivelNavigator.ToggleState.Estrutural)
							this.nivelNavigator1.UpdateSelectedNodeName(Nivel.GetDesignacao(NivelRow));
						else
                            this.nivelNavigator1.UpdateSelectedListItemName(Nivel.GetDesignacao(NivelRow));
					}

					// Forçar a gravação do documento
					CurrentContext.SetNivelEstrututalDocumental(null);
					CurrentContext.SetNivelEstrututalDocumental(NivelRow);
					break;
			}
		}
        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();
            }
        }