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; } }
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; }