Exemplo n.º 1
0
		// NOTA: este processo evolui normalmente partindo sempre do princípio que o CA a 
		//       editar existe na BD. Se não for o caso, essa informação não existe, 
		//       neste ponto de execução tendo de ser verificada somente aquando da gravação dos dados
		private void ClickBtnEditar()
		{
			((frmMain)TopLevelControl).EnterWaitMode();
			FormCreateControloAut form = null;
			ListViewItem cadItem = null;
			GISADataset.ControloAutDicionarioRow contextCadRow = null;
			GISADataset.TipoNoticiaAutRow contextNoticiaAutRow = null;
			try
			{
				if (caList.SelectedItems.Count < 1)
					return;

				cadItem = caList.SelectedItems[0];
				contextCadRow = (GISADataset.ControloAutDicionarioRow)cadItem.Tag;

				if (contextCadRow.RowState == DataRowState.Detached)
				{
					MessageBox.Show("Não é possível editar a notícia de autoridade selecionada " + System.Environment.NewLine + "uma vez que foi apagada por outro utilizador.", "Edição de notícias de autoridade", MessageBoxButtons.OK, MessageBoxIcon.Warning);
					return;
				}

				// so é possível editar termos autorizados
				if (contextCadRow.IDTipoControloAutForma != Convert.ToInt64(TipoControloAutForma.FormaAutorizada))
					return;

				contextNoticiaAutRow = contextCadRow.ControloAutRow.TipoNoticiaAutRow;

				if (GetCurrentTipoNoticiaAut()[0] == TipoNoticiaAut.EntidadeProdutora)
				{
					form = new FormCreateEntidadeProdutora();
					((FormCreateEntidadeProdutora)form).txtCodigo.Text = contextCadRow.ControloAutRow.GetNivelControloAutRows()[0].NivelRow.Codigo;
				}
				else
					form = new FormCreateControloAut();

				form.Text = "Editar notícia de autoridade";
				form.cbNoticiaAut.DataSource = caList.cbNoticiaAut.DataSource;
				form.cbNoticiaAut.DisplayMember = caList.cbNoticiaAut.DisplayMember;
				form.cbNoticiaAut.SelectedItem = contextNoticiaAutRow;
				if (form.cbNoticiaAut.Items.Count == 2)
					form.cbNoticiaAut.Enabled = false;

				form.ListTermos.rbEscolher.Checked = true;
				form.SetControloAutDicionarioRow(contextCadRow);
				form.LoadData(true);
			}
			finally
			{
				((frmMain)TopLevelControl).LeaveWaitMode();
			}

			bool updateIndex = false;
			switch (form.ShowDialog())
			{
				case DialogResult.OK:
					Trace.WriteLine("A editar 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;//.Replace("'", "''");
						dicionarioRow.CatCode = "CA";
						dicionarioRow.Versao = new byte[]{};
                        dicionarioRow.isDeleted = 0;
					}

					GISADataset.ControloAutRow caRow = contextCadRow.ControloAutRow;

					// excluir selecção de termos inválidos. nunca deveria acontecer
					Trace.Assert(dicionarioRow != null);

					// obter o tipo de noticia de autoridade escolhido
					GISADataset.TipoNoticiaAutRow tnaRow = null;
					tnaRow = form.SelectedTipoNoticiaAut;
                    if (caRow.IDTipoNoticiaAut != tnaRow.ID)
                        caRow.TipoNoticiaAutRow = tnaRow;

					GISADataset.NivelRow nRow = null;
					if (GetCurrentTipoNoticiaAut()[0] == TipoNoticiaAut.EntidadeProdutora)
						nRow = caRow.GetNivelControloAutRows()[0].NivelRow;

					// excluir selecção de tipos de noticia de autoridade inválidos. nunca deveria acontecer
					Trace.Assert(tnaRow != null);

					// se estiver a ser usado o mesmo termo e o mesmo tipo de noticia de 
					// autoridade não é necessária mais nenhuma acção
					if (dicionarioRow == contextCadRow.DicionarioRow && tnaRow == contextNoticiaAutRow && (GetCurrentTipoNoticiaAut()[0] != TipoNoticiaAut.EntidadeProdutora || ((FormCreateEntidadeProdutora)form).txtCodigo.Text.Equals(nRow.Codigo)))
						return;

					//Dim QueryFilter As String
					// 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)
						GisaDataSetHelper.GetInstance().Dicionario.AddDicionarioRow(dicionarioRow);

					if (GetCurrentTipoNoticiaAut()[0] == TipoNoticiaAut.EntidadeProdutora)
						nRow.Codigo = ((FormCreateEntidadeProdutora)form).txtCodigo.Text;

                    // Marcar que houve uma edição para posteriormente ser adicinado um registo na lista de revisões
                    CurrentContext.RaiseRegisterModificationEvent(caRow);

					GISADataset.TipoControloAutFormaRow tcafRowAutorizado = null;
					tcafRowAutorizado = (GISADataset.TipoControloAutFormaRow)(GisaDataSetHelper.GetInstance().TipoControloAutForma.Select("ID=" + System.Enum.Format(typeof(TipoControloAutForma), TipoControloAutForma.FormaAutorizada, "D"))[0]);

					PersistencyHelper.EditControloAutPreConcArguments args = new PersistencyHelper.EditControloAutPreConcArguments();
                    var oldTermo = string.Empty;
                    var newTermo = string.Empty;

					if (contextCadRow.IDDicionario != dicionarioRow.ID)
					{
                        oldTermo = contextCadRow.DicionarioRow.Termo;
                        newTermo = dicionarioRow.Termo;

						args.origDRowID = contextCadRow.DicionarioRow.ID;
						// alterar o registo de ControloAutDicionario com TipoControloAutforma "autorizado" para que faça uso do novo termo
						contextCadRow.Delete();

						GISADataset.ControloAutDicionarioRow cadRow = null;
						cadRow = GisaDataSetHelper.GetInstance().ControloAutDicionario.AddControloAutDicionarioRow(caRow, dicionarioRow, tcafRowAutorizado, new byte[]{}, 0);

						try
						{
							args.newCadRowIDControloAut = cadRow.IDControloAut;
							args.newCadRowIDDicionario = cadRow.IDDicionario;
							args.newCadRowIDTipoControloAutForma = cadRow.IDTipoControloAutForma;
							args.newDRowID = dicionarioRow.ID;
							args.origCadRowIDControloAut = (long)(contextCadRow["IDControloAut", DataRowVersion.Original]);
							args.origCadRowIDDicionario = (long)(contextCadRow["IDDicionario", DataRowVersion.Original]);
							args.origCadRowIDTipoControloAutForma = (long)(contextCadRow["IDTipoControloAutForma", DataRowVersion.Original]);
							if (caRow.IDTipoNoticiaAut == Convert.ToInt64(TipoNoticiaAut.EntidadeProdutora))
								args.nRowID = nRow.ID;

							args.caRowID = caRow.ID;

							PersistencyHelper.save(editCA, args);

							if (args.editCAError == PersistencyHelper.EditControloAutPreConcArguments.EditCAErrors.NoError)
							{
								updateIndex = true;

								cadItem.Tag = cadRow;
								cadItem.Text = cadRow.DicionarioRow.Termo;
								cadItem.SubItems[2].Text = TranslationHelper.FormatBoolean(cadRow.ControloAutRow.Autorizado);
								cadItem.SubItems[3].Text = TranslationHelper.FormatBoolean(cadRow.ControloAutRow.Completo);

								// se o item da GUI tiver sido removido pelo handler de rowchange tornamos a readiciona-lo
								if (cadItem.ListView == null)
								{
									caList.Items.Add(cadItem);
								}

								// é forçada uma mudança de contexto por forma a proceder-se à actualização do código de
								// no painel de descrição das entidades produtoras
								//if (caRow.IDTipoNoticiaAut == Convert.ToInt64(TipoNoticiaAut.EntidadeProdutora))
								//{
									((PxListView)cadItem.ListView).clearItemSelection(cadItem);
								//}
                                
								((PxListView)cadItem.ListView).selectItem(cadItem);								
							}
							else
							{
								if (args.editCAError == PersistencyHelper.EditControloAutPreConcArguments.EditCAErrors.OrigCadDeleted)
								{

									IDbConnection conn = GisaDataSetHelper.GetConnection();
									try
									{
										conn.Open();
										ControloAutRule.Current.LoadDicionarioAndControloAutDicionario(GisaDataSetHelper.GetInstance(), caRow.ID, conn);
									}
									finally
									{
										conn.Close();
									}

									string QueryFilterNewCad = string.Format("IDControloAut = {0} AND NOT IDDicionario = {1} AND IDTipoControloAutForma = 1", caRow.ID, contextCadRow.IDDicionario);

									GISADataset.ControloAutDicionarioRow newCad = (GISADataset.ControloAutDicionarioRow)(GisaDataSetHelper.GetInstance().ControloAutDicionario.Select(QueryFilterNewCad)[0]);
									cadItem.Tag = newCad;
									cadItem.Text = newCad.DicionarioRow.Termo;
								}
								else if (args.editCAError == PersistencyHelper.EditControloAutPreConcArguments.EditCAErrors.CADeleted)
								{
									// forçar uma perda de contexto uma vez que o contexto actual não é válido
									caList.ClearItemSelection(caList.SelectedItems[0]);
								}
								else if (args.editCAError == PersistencyHelper.EditControloAutPreConcArguments.EditCAErrors.AlreadyUsedCodigo)
								{
									// não está prevista qualquer operação nesta situação
								}
								MessageBox.Show(args.message, "Editar notícia de autoridade", MessageBoxButtons.OK, MessageBoxIcon.Warning);
							}
						}
						catch (Exception ex)
						{
							Trace.WriteLine(ex);
							throw;
						}
						finally
						{
                            PersistencyHelper.cleanDeletedData(new List<TableDepthOrdered.TableCloudType>(new TableDepthOrdered.TableCloudType[] { PersistencyHelper.determinaNuvem("Nivel"), PersistencyHelper.determinaNuvem("ControloAut") }));
						}
					}
					else if (nRow != null && nRow.RowState == DataRowState.Modified)
					{
						try
						{
							//só o código da Entidade Produtora foi alterado 
							args.nRowID = nRow.ID;
							args.caRowID = -1; //indicar que a operação só envolve a edição do código
							PersistencyHelper.save(editCA, args);
							if (args.editCAError == PersistencyHelper.EditControloAutPreConcArguments.EditCAErrors.CADeleted)
							{
								MessageBox.Show(args.message, "Editar notícia de autoridade", MessageBoxButtons.OK, MessageBoxIcon.Warning);
								// forçar uma perda de contexto uma vez que o contexto actual não é válido
								caList.ClearItemSelection(caList.SelectedItems[0]);
							}
							else if (args.editCAError == PersistencyHelper.EditControloAutPreConcArguments.EditCAErrors.AlreadyUsedCodigo)
								MessageBox.Show(args.message, "Editar notícia de autoridade", MessageBoxButtons.OK, MessageBoxIcon.Warning);
							else if (args.editCAError == PersistencyHelper.EditControloAutPreConcArguments.EditCAErrors.NoError)
							{
								updateIndex = true;
								((PxListView)cadItem.ListView).clearItemSelection(cadItem);
								((PxListView)cadItem.ListView).selectItem(cadItem);
							}
						}
						catch (Exception ex)
						{
							Trace.WriteLine(ex);
							throw;
						}
						finally
						{
                            PersistencyHelper.cleanDeletedData(new List<TableDepthOrdered.TableCloudType>(new TableDepthOrdered.TableCloudType[] { PersistencyHelper.determinaNuvem("Nivel"), PersistencyHelper.determinaNuvem("ControloAut") }));
						}
					}
					else
					{
						try
						{
							//só o tipo de notícia de autoridade do conteúdo foi alterado 
							args.caRowID = caRow.ID;

							PersistencyHelper.SaveResult successfulSave = PersistencyHelper.save(editCA, args);
							if (args.editCAError == PersistencyHelper.EditControloAutPreConcArguments.EditCAErrors.CADeleted)
							{
								MessageBox.Show(args.message, "Editar notícia de autoridade", MessageBoxButtons.OK, MessageBoxIcon.Warning);
								// forçar uma perda de contexto uma vez que o contexto actual não é válido
								caList.ClearItemSelection(caList.SelectedItems[0]);
							}
							else
							{
                                updateIndex = successfulSave == PersistencyHelper.SaveResult.successful;
                                ((PxListView)cadItem.ListView).clearItemSelection(cadItem);
                                ((PxListView)cadItem.ListView).selectItem(cadItem);
							}
						}
						catch (Exception ex)
						{
							Trace.WriteLine(ex);
							throw;
						}
						finally
						{
                            PersistencyHelper.cleanDeletedData(new List<TableDepthOrdered.TableCloudType>(new TableDepthOrdered.TableCloudType[] { PersistencyHelper.determinaNuvem("Nivel"), PersistencyHelper.determinaNuvem("ControloAut") }));
						}
					}

					if (updateIndex)
					{
						GisaDataSetHelper.HoldOpen ho = new GisaDataSetHelper.HoldOpen(GisaDataSetHelper.GetConnection());
						try
						{
							List<string> IDNiveis = ControloAutRule.Current.GetNiveisDocAssociados(caRow.ID, ho.Connection);
							GISA.Search.Updater.updateNivelDocumental(IDNiveis);
                            switch (caRow.IDTipoNoticiaAut)
                            {
                                case (long)TipoNoticiaAut.EntidadeProdutora:
                                    GISA.Search.Updater.updateProdutor(caRow.ID);
                                    GISA.Search.Updater.updateNivelDocumentalComProdutores(caRow.GetNivelControloAutRows()[0].ID);
                                    break;
                                case (long)TipoNoticiaAut.Onomastico:
                                case (long)TipoNoticiaAut.Ideografico:
                                case (long)TipoNoticiaAut.ToponimicoGeografico:
                                    GISA.Search.Updater.updateAssunto(caRow.ID);
                                    if (SessionHelper.AppConfiguration.GetCurrentAppconfiguration().IsFedoraEnable())
                                        SessionHelper.AppConfiguration.GetCurrentAppconfiguration().FedoraHelperSingleton.ActualizaObjDigitaisPorNivel(IDNiveis, oldTermo, newTermo, caRow.IDTipoNoticiaAut);
                                    break;
                                case (long)TipoNoticiaAut.TipologiaInformacional:
                                    GISA.Search.Updater.updateTipologia(caRow.ID);
                                    if (SessionHelper.AppConfiguration.GetCurrentAppconfiguration().IsFedoraEnable())
                                        SessionHelper.AppConfiguration.GetCurrentAppconfiguration().FedoraHelperSingleton.ActualizaObjDigitaisPorNivel(IDNiveis, oldTermo, newTermo, caRow.IDTipoNoticiaAut);
                                    break;
                            }
						}
						catch (Exception ex)
						{
							Trace.WriteLine(ex.ToString());
							throw;
						}
						finally
						{
							ho.Dispose();
						}
					}

					if (! (tnaRow == contextNoticiaAutRow))
						cadItem.SubItems[1].Text = tnaRow.Designacao;
					break;
				case DialogResult.Cancel:
				break;
			}
		}
Exemplo n.º 2
0
        void SuggestionPickerRA_CreateEntidadeInterna(object sender, ref EntidadeInterna ei, TipoEntidadeExterna tee, out bool cancel, out TipoEstado estado)
        {
            estado = TipoEstado.Novo;
            cancel = false;
            FormCreateControloAut form = null;
            var rai = (RegistoAutoridadeInterno)ei;
            var tna = TipoEntidade.GetTipoNoticiaAut(tee);
            if (tna == TipoNoticiaAut.EntidadeProdutora)
                form = new FormCreateEntidadeProdutora();
            else
                form = new FormCreateControloAut();

            if (tna == TipoNoticiaAut.Onomastico)
            {
                form.SetOptionalControlsVisible(true);
                form.NIF = ei != null ? ((Model.EntidadesInternas.Onomastico)ei).Codigo : "";
            }

            GISADataset.TipoNoticiaAutRow allNoticiaAut = null;
            allNoticiaAut = GisaDataSetHelper.GetInstance().TipoNoticiaAut.NewTipoNoticiaAutRow();
            allNoticiaAut.ID = -1;
            allNoticiaAut.Designacao = "<Todos>";

            List<GISADataset.TipoNoticiaAutRow> rows = new List<GISADataset.TipoNoticiaAutRow>();
            rows.Add(allNoticiaAut);
            rows.AddRange(GisaDataSetHelper.GetInstance().TipoNoticiaAut.Cast<GISADataset.TipoNoticiaAutRow>().Where(r => r.ID == (long)tna));

            form.cbNoticiaAut.BeginUpdate();
            form.cbNoticiaAut.DataSource = rows;
            form.cbNoticiaAut.DisplayMember = "Designacao";
            form.cbNoticiaAut.EndUpdate();
            if (form.cbNoticiaAut.Items.Count == 2)
            {
                form.cbNoticiaAut.SelectedIndex = 1;
                form.cbNoticiaAut.Enabled = false;
            }
            form.LoadData(true);

            switch (form.ShowDialog())
            {
                case DialogResult.OK:
                    var termo = form.ListTermos.ValidAuthorizedForm.Replace("'", "''");
                    switch (tna)
                    {
                        case TipoNoticiaAut.EntidadeProdutora:
                            var produtor = new Model.EntidadesInternas.Produtor();
                            produtor.Codigo = ((FormCreateEntidadeProdutora)form).txtCodigo.Text;
                            estado = TipoEstado.Novo;
                            rai = produtor;
                            break;
                        case TipoNoticiaAut.Onomastico:
                            rai = new Model.EntidadesInternas.Onomastico();
                            ((Model.EntidadesInternas.Onomastico)rai).Codigo = form.NIF;
                            estado = TipoEstado.Novo;
                            break;
                        case TipoNoticiaAut.Ideografico:
                            rai = new Model.EntidadesInternas.Ideografico();
                            estado = TipoEstado.Novo;
                            break;
                        case TipoNoticiaAut.ToponimicoGeografico:
                            rai = new Model.EntidadesInternas.Geografico();
                            estado = TipoEstado.Novo;
                            break;
                        case TipoNoticiaAut.TipologiaInformacional:
                            rai = new Model.EntidadesInternas.Tipologia();
                            var tipOriginal = this.correspDocumento.CorrespondenciasRAs.Where(cRa => cRa.GetEntidadeInterna(TipoOpcao.Original) != null && cRa.EntidadeInterna.GetType() == typeof(Model.EntidadesInternas.Tipologia)).SingleOrDefault();
                            estado = tipOriginal != null ? TipoEstado.Editar : TipoEstado.Novo;
                            break;
                    }
                    rai.Titulo = termo;
                    rai.Estado = TipoEstado.Novo;
                    ei = this.InternalEntitiesLst.AddInternalEntity(rai);
                    break;
                case DialogResult.Cancel:
                    cancel = true;
                    break;
            }
        }
Exemplo n.º 3
0
		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;
			}
		}